【13 Listener 学习笔记】

news2024/9/23 1:22:48

1. Listener监听器

在这里插入图片描述
在这里插入图片描述

2. 监听对象的监听器

2.1 ServletContetListener

在这里插入图片描述

2.2 HttpSessionListener

在这里插入图片描述

2.3 ServletRequestListener

在这里插入图片描述

3. 监听域对象属性变化的监听器

3.1 ServletContextAttributeListener

在这里插入图片描述

3.2 HttpSessionAttributeListener

在这里插入图片描述

3.3 ServletRequestAttributeListener

在这里插入图片描述

4. 监听会话相关的感知型监听器

4.1 HttpSessionBindingListener

在这里插入图片描述

4.2 HttpSessionActivationListener

钝化与活化:

Session的活化和钝化
Session机制很好的解决了Cookie的不足,但是当访问应用的用户很多时,服务器上就会创建非常多的Session对象,如果不对这些Session对象进行处理,那么在Session失效之前,这些Session一直都会在服务器的内存中存在。那么就,就出现了Session活化和钝化的机制。

1)Session钝化:
Session在一段时间内没有被使用时,会将当前存在的Session对象序列化到磁盘上,而不再占用内存空间。

2)Session活化:
Session被钝化后,服务器再次调用Session对象时,将Session对象由磁盘中加载到内存中使用。
如果希望Session域中的对象也能够随Session钝化过程一起序列化到磁盘上,则对象的实现类也必须实现java.io.Serializable接口。不仅如此,如果对象中还包含其他对象的引用,则被关联的对象也必须支持序列化,否则会抛出异常:java.io.NotSerializableException

在这里插入图片描述

5. 监听器的使用

一共八个
在这里插入图片描述

5.1 ServletContextListener使用


import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * ServletContext对象创建和销毁的监听器
 */
@WebListener
public class ListenerDemo implements ServletContextListener {
    /**
     * @Description ServletContext创建的时候执行
     */
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("监听到了对象创建");
        //获取对象
        ServletContext servletContext = sce.getServletContext();
        System.out.println(servletContext);
    }
    /**
     * @Description ServletContext 销毁的时候执行
     */

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("监听到了对象销毁");
        //获取对象
        ServletContext servletContext = sce.getServletContext();
        System.out.println(servletContext);
    }
}

5.2 ServletContextAttributeListener使用

除了使用@weblistener注解还可以在web.xml中配置监听器
下面两个监听器注解替换为web.xml中配置
在这里插入图片描述


import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * ServletContext对象创建和销毁的监听器
 */
@WebListener
public class ListenerDemo implements ServletContextListener {
    /**
     * @Description ServletContext创建的时候执行
     */
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("监听到了对象创建");
        //获取对象
        ServletContext servletContext = sce.getServletContext();
        System.out.println(servletContext);
        servletContext.setAttribute("username","zhngsan");
        servletContext.setAttribute("username","lisi");
        servletContext.removeAttribute("username");
    }
    /**
     * @Description ServletContext 销毁的时候执行
     */

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("监听到了对象销毁");
        //获取对象
        ServletContext servletContext = sce.getServletContext();
        System.out.println(servletContext);
    }
}

import javax.servlet.*;
import javax.servlet.annotation.WebListener;

/**
 * 应用域对象中的属性变化的监听器
 */
@WebListener
public class ListenerAttributeDemo implements ServletContextAttributeListener {
    //添加属性时候的监听
    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        System.out.println("监听到了属性的添加...");
        //获取应用域对象
        Object username = event.getServletContext().getAttribute("username");
        System.out.println(username);
    }

    //移除属性时候的监听
    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {
        System.out.println("监听到了属性的移除...");
        //获取应用域对象
        Object username = event.getServletContext().getAttribute("username");
        System.out.println(username);
    }
    //替换属性时候的监听
    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {
        System.out.println("监听到了属性的替换...");
        //获取应用域对象
        Object username = event.getServletContext().getAttribute("username");
        System.out.println(username);
    }
}

6. Javaweb综合案例

version 1.0

之前实现:

首页


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>学生管理系统首页</title>
</head>
<body>

<% Object username = session.getAttribute("username");
  if (username == null) {
%>
<a href="/student/login.jsp">请登录</a>
<%} else {%>
<a href="/student/addStudent.jsp">添加学生</a>
<a href="/student/listStudentServlet">查看学生</a>
<%}%>
</body>
</html>

登录页


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>学生登录</title>
</head>
<body>
<form action="/student/loginServlet" method="get" autocomplete="off">

  用户名: <input type="text" name="username"><br>
  密码:<input type="password" name="password"><br>
    <button type="submit">登录</button>
</form>


</body>
</html>

登录页面请求处理


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 javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         //获取用户名和密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //判断用户名
        if (username==null||"".equals(username)){
            //用户名为空 重定向到登录界面
            resp.sendRedirect("/student/login.jsp");
            return;
        }
        if (username.equals("zhufanzhi")&&password.equals("123")){
            //不为空  存入会话域
            HttpSession session = req.getSession();
            session.setAttribute("username",username);
            //重定向到首页jsp
            resp.sendRedirect("/student/index.jsp");
        }else {
            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("用户名密码错误。请重新登录");
            resp.setHeader("Refresh","2;URL=/student/login.jsp");
            return;
        }



    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}

添加学生页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加学生</title>
</head>
<body>
<form action="/student/addServlet" method="get" autocomplete="off">

    姓名: <input type="text" name="username"><br>
    年龄:<input type="number" name="age"><br>
    分数:<input type="number" name="score"><br>
    <button type="submit">保存</button>
</form>
</body>
</html>

实体类


public class Student {
  private   String username;
  private   int age;
  private   int score;

    @Override
    public String toString() {
        return "Student{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }

    public Student() {
    }

    public Student(String username, int age, int score) {
        this.username = username;
        this.age = age;
        this.score = score;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }
}

添加学生请求处理


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.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;


@WebServlet("/listStudentServlet")
public class listStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1. 创建字符输入流对象 关联读取文件
        BufferedReader br=new BufferedReader(new FileReader("d:\\stu.txt"));
        //2. 创建集合对象 用于保存Student对象
        ArrayList<Student > list=new ArrayList<>();
        //3.循环读取文件中的数据 将数据封装到Student 对象中 再把多个学生对象添加到集合中
        String line;
        while ((line=br.readLine())!=null){
            // 张三 18 100
            Student stu=new Student();
            String[] arr = line.split(",");
            stu.setUsername(arr[0]);
            stu.setAge(Integer.parseInt(arr[1]));
            stu.setScore(Integer.parseInt(arr[2]));
            list.add(stu);

        }

        //4.遍历集合 将数据响应到浏览器
        //获取输出流对象
        resp.setContentType("text/html;charset=UTF-8");
//        PrintWriter pw = resp.getWriter();
//        for (Student s:list){
//            pw.write(s.getUsername()+","+s.getAge()+","+s.getScore());
//            pw.write("<br>");
//        }
        req.getSession().setAttribute("stus",list);
        //5.重定向
        resp.sendRedirect("/student/list.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}

学生列表页面展示

<%@ page import="java.util.ArrayList" %>
<%@ page import="com.example.student_manage.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>查看学生</title>
</head>
<body>

<table width="600px" border="1px">
    <tr>
        <th>姓名</th>
        <th>年龄</th>
        <th>成绩</th>

    </tr>
 <%  ArrayList<Student> students= (ArrayList<Student>) session.getAttribute("stus");
   for (Student stu:students ){

 %>
    <tr>
        <td><%=stu.getUsername()%></td>
        <td><%=stu.getAge()%></td>
        <td><%=stu.getScore()%></td>

    </tr>
    <%}%>

</table>

</body>
</html>

学生列表请求处理


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.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;


@WebServlet("/listStudentServlet")
public class listStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1. 创建字符输入流对象 关联读取文件
        BufferedReader br=new BufferedReader(new FileReader("d:\\stu.txt"));
        //2. 创建集合对象 用于保存Student对象
        ArrayList<Student > list=new ArrayList<>();
        //3.循环读取文件中的数据 将数据封装到Student 对象中 再把多个学生对象添加到集合中
        String line;
        while ((line=br.readLine())!=null){
            // 张三 18 100
            Student stu=new Student();
            String[] arr = line.split(",");
            stu.setUsername(arr[0]);
            stu.setAge(Integer.parseInt(arr[1]));
            stu.setScore(Integer.parseInt(arr[2]));
            list.add(stu);

        }

        //4.遍历集合 将数据响应到浏览器
        //获取输出流对象
        resp.setContentType("text/html;charset=UTF-8");
//        PrintWriter pw = resp.getWriter();
//        for (Student s:list){
//            pw.write(s.getUsername()+","+s.getAge()+","+s.getScore());
//            pw.write("<br>");
//        }
        req.getSession().setAttribute("stus",list);
        //5.重定向
        resp.sendRedirect("/student/list.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}

version 2.0

优化1:使用过滤器配置全局中文乱码问题
优化2:将jspjava代码块改为EL表达式和JSTL
优化3:权限拦截实现,用户未登录不能进行操作
优化4:虚拟目录变为动态获取

优化1:


import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 *  解决全局乱码问题
 */

@WebFilter("/*")
public class EncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        //1. 将请求和响应对象转化未Http协议相关
        HttpServletRequest httpServletRequest= (HttpServletRequest) request;
        HttpServletResponse httpServletResponse= (HttpServletResponse) response;
        //2.设置编码格式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //3.放行
        filterChain.doFilter(httpServletRequest,httpServletResponse);

    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

优化2:

    <c:forEach items="${stus}" var="s">

    <tr align="center">
        <td>${s.username}</td>
        <td>${s.age}</td>
        <td>${s.score}</td>
    </tr>
    </c:forEach>

优化3:登录拦截


import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 登录拦截请求
 * 未登录 拦截addStudent页面和展示学生页面
 **/
@WebFilter(value = {"/addStudent.jsp","/listStudentServlet"})
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //1. 将请求和响应对象转化未Http协议相关
        HttpServletRequest request= (HttpServletRequest) servletRequest;
        HttpServletResponse response= (HttpServletResponse) servletResponse;

        //2. 拦截 获取会话域信息 判断用户名
        Object username = request.getSession().getAttribute("username");
        if (username==null||"".equals(username)){
            //重定向到登录页面
            response.sendRedirect(request.getContextPath()+"/login.jsp");
            return;
        }


        //3. 放行
        filterChain.doFilter(request,response);




    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

优化4:

在这里插入图片描述
增加学生页面的请求改为动态虚拟路径
在这里插入图片描述
完整代码:

******************首页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
  <title>学生管理系统首页</title>
</head>
<body>
<%--*********************version 1.0--%>
<%--<% Object username = session.getAttribute("username");--%>
<%--  if (username == null) {--%>
<%--%>--%>
<%--<a href="/student/login.jsp">请登录</a>--%>
<%--&lt;%&ndash;<%} else {%>&ndash;%&gt;--%>
<%--<a href="/student/addStudent.jsp">添加学生</a>--%>
<%--<a href="/student/listStudentServlet">查看学生</a>--%>
<%--<%}%>--%>


<%--************************version 2.0--%>

<c:if test="${sessionScope.username eq null}">
  <a href="${pageContext.request.contextPath}/login.jsp">请登录</a>
</c:if>

<c:if test="${sessionScope.username ne null}">
  <a href="${pageContext.request.contextPath}/addStudent.jsp">添加学生</a>
  <a href="${pageContext.request.contextPath}/listStudentServlet">查看学生</a>

</c:if>


</body>
</html>
******************登录页

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>学生登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/loginServlet" method="get" autocomplete="off">

  用户名: <input type="text" name="username"><br>
  密码:<input type="password" name="password"><br>
    <button type="submit">登录</button>
</form>


</body>
</html>
******************登录请求处理

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 javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         //获取用户名和密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //判断用户名
        if (username==null||"".equals(username)){
            //用户名为空 重定向到登录界面
            resp.sendRedirect("/student/login.jsp");
            return;
        }
        if (username.equals("zhufanzhi")&&password.equals("123")){
            //不为空  存入会话域
            HttpSession session = req.getSession();
            session.setAttribute("username",username);
            //重定向到首页jsp
            resp.sendRedirect("/student/index.jsp");
        }else {
//            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("用户名密码错误。请重新登录");
            resp.setHeader("Refresh","2;URL=/student/login.jsp");
            return;
        }



    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}
***************************添加学生页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加学生</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/addServlet" method="get" autocomplete="off">

    姓名: <input type="text" name="username"><br>
    年龄:<input type="number" name="age"><br>
    分数:<input type="number" name="score"><br>
    <button type="submit">保存</button>
</form>
</body>
</html>
**************************添加学生请求处理

@WebServlet("/addServlet")
public class addStudent extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1. 获取表单数据
        String username = req.getParameter("username");
        String age = req.getParameter("age");
        String score = req.getParameter("score");
        //2. 创建学生对象并赋值
        Student student = new Student(username, Integer.parseInt(age), Integer.parseInt(score));
        //3.将学生对象的数据保存到d:\\stu.txt
        BufferedWriter bw=new BufferedWriter(new FileWriter("d:\\stu.txt",true));
        bw.write(student.getUsername()+","+student.getAge()+","+student.getScore());
        bw.newLine();
        bw.close();
        //4.通过定时刷新功能响应给浏览器
//        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write("添加成功。2秒后自动跳转到首页");
        resp.setHeader("Refresh","2;URL=/student/index.jsp");




    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}

*****************************展示学生页面
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.example.student_manage.bean.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>查看学生</title>
</head>
<body>
<%--*************************** version 1.0 --%>
<%--<table width="600px" border="1px">--%>
<%--    <tr>--%>
<%--        <th>姓名</th>--%>
<%--        <th>年龄</th>--%>
<%--        <th>成绩</th>--%>
<%--    </tr>--%>
<%-- <%  ArrayList<Student> students= (ArrayList<Student>) session.getAttribute("stus");--%>
<%--   for (Student stu:students ){--%>

<%-- %>--%>
<%--    <tr>--%>
<%--        <td><%=stu.getUsername()%></td>--%>
<%--        <td><%=stu.getAge()%></td>--%>
<%--        <td><%=stu.getScore()%></td>--%>
<%--    </tr>--%>
<%--    <%}%>--%>

<%--</table>--%>
<%--*************************** version 2.0 --%>
<table width="600px" border="1px">
    <tr>
        <th>学生姓名</th>
        <th>学生年龄</th>
        <th>学生成绩</th>
    </tr>
<%--items 中为后端传来的数据  var 代表遍历买一个元素--%>
    <c:forEach items="${stus}" var="s">

    <tr align="center">
        <td>${s.username}</td>
        <td>${s.age}</td>
        <td>${s.score}</td>
    </tr>
    </c:forEach>


</table>

</body>
</html>
*****************************展示学生页面请求处理

import com.example.student_manage.bean.Student;

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.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

@WebServlet("/addServlet")
public class addStudent extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1. 获取表单数据
        String username = req.getParameter("username");
        String age = req.getParameter("age");
        String score = req.getParameter("score");
        //2. 创建学生对象并赋值
        Student student = new Student(username, Integer.parseInt(age), Integer.parseInt(score));
        //3.将学生对象的数据保存到d:\\stu.txt
        BufferedWriter bw=new BufferedWriter(new FileWriter("d:\\stu.txt",true));
        bw.write(student.getUsername()+","+student.getAge()+","+student.getScore());
        bw.newLine();
        bw.close();
        //4.通过定时刷新功能响应给浏览器
//        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write("添加成功。2秒后自动跳转到首页");
        resp.setHeader("Refresh","2;URL=/student/index.jsp");




    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}
************************过滤器配置上述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/447346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一个小技巧:如何去水印而不损图片?赶紧学起来

在数码时代中&#xff0c;照片的处理与分享已经成为了我们日常中不可或缺的一部分。但是&#xff0c;大家在网上保存的图片常常会带有水印&#xff0c;非常影响图片的观赏性。水印旨在防止照片被盗用或侵权&#xff0c;但有时候它也很破坏照片的美感&#xff0c;因此许多人都在…

超级实用的C++学习网站

重要说明&#xff1a;该博客长期更新&#xff0c;方便读者查阅&#xff01; 一、参考资料 学习C这几个网站足矣 二、C学习网站 C中文网 cppreference 当之无愧的C学习第一网站。该网站希望给程序员提供一个关于C和C的完整的在线参考&#xff0c;所以它的内容非常的丰富。有…

动态类型语言、静态类型语言、强类型语言、弱类型语言解释

首先要明确这些名词都是针对数据类型展开的各自定义&#xff0c;同样针对数据类型在编译时和运行时会有一些限定或者规则存在。动态类型语言不能等同于弱类型语言&#xff0c;静态类型语言也不能等同于强类型语言。 静态类型语言和动态类型语言放到一个维度来进行评价类型系统&…

ClickHouse物化视图

目录 1 概述1.1 物化视图与普通视图的区别1.2 优缺点1.3 基本语法 2 案例实操2.1 准备测试用表和数据2.2 创建物化视图2.3 导入增量数据2.4 导入历史数据 1 概述 ClickHouse 的物化视图是一种查询结果的持久化&#xff0c;它确实是给我们带来了查询效率的提升。用户查起来跟表没…

MYSQL---主从同步概述与配置

一、MYSQL主从同步概述 1、什么是MySQL主从同步&#xff1f; 实现数据自动同步的服务结构 主服务器(master): 接受客户端访问连接 从服务器(slave)&#xff1a;自动同步主服务器数据 2、主从同步原理 Maste&#xff1a;启用binlog 日志 Slave&#xff1a;Slave_IO: 复制master主…

CPU寄存器的分类与Intel 8086 的eax,ebx,ecx,edx

目录 一、CPU中的寄存器分类 1.用户可见寄存器 2.控制和状态寄存器 一、CPU中的寄存器分类 大致分为两类: 一类属于用户可见寄存器&#xff0c;对这类寄存器编程&#xff0c;以及通过优化使CPU因使用这类寄存器&#xff0c;而减少对主存的访问次数&#xff0c; 另一类属于控…

MPRC086444-005对其进行维护和管理,以确保系统的稳定性和可靠性。

​ MPRC086444-005对其进行维护和管理&#xff0c;以确保系统的稳定性和可靠性。 变电站自动化系统优缺点 变电站自动化系统结构 变电站自动化系统优缺点 变电站自动化系统是以计算机技术、自动控制技术及通信技术为核心&#xff0c;对变电站及配电系统各个环节进行自动化控制和…

自动化生成持久化游戏管理器

自动化生成持久化游戏管理器 引言游戏管理器持久化自动化生成游戏管理器Addressables 引言 自动化生成的持久化游戏管理器是一个指通过使用自动化工具和技术来生成游戏的持久化管理器的过程。持久化管理器是负责管理游戏状态的组件&#xff0c;包括存储和检索游戏数据的功能&a…

GPT3 和它的 In-Context Learning

作者 | 太子长琴 整理 | NewBeeNLP 大家好&#xff0c;这里是NewBeeNLP。ChatGPT 的爆火让很多 NLPer 大吃一惊&#xff0c;焦虑感爆棚&#xff0c;它的思路和方法都不复杂&#xff0c;但效果却出奇的好。 我想任何研究成果的爆发都不可能是一蹴而就的&#xff0c;期间必然包含…

【历史上的今天】4 月 18 日:第一款交互式电子游戏;IBM 率先研发兆位芯片;硬件公司 Roland 成立

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 18 日&#xff0c;在 1955 年的今天&#xff0c;著名物理学家爱因斯坦在美国新泽西州的普林斯顿逝世。爱因斯坦于 1905 年获得物理学博士学位&#xff0c…

vue---双向绑定

目录 1、.sync修饰符-双向绑定 2、v-model修饰符-双向绑定 3、双向绑定原理 vue 中的双向绑定是语法糖。 1、.sync修饰符-双向绑定 . vue是单向数据流的。父组件可以通过prop向子组件传递数据。子组件需要通过自定义事件来将自己的数据变更通知给父组件&#xff0c;我们可以通过…

分布式任务调度系统分析

背景介绍 首先&#xff0c;我们来思考一些几个业务场景&#xff1a; XX 信用卡中心&#xff0c;每月 28 日凌晨 1:00 到 3:00 需要完成全网用户当月的费用清单的生成XX 电商平台&#xff0c;需要每天上午 9:00 开始向会员推送送优惠券使用提醒XX 公司&#xff0c;需要定时执行…

多线程并发编程学习笔记9(小滴课堂)------线程池及Executor框架

它只会使用10个线程。因为我们设置了它的容量。 我们现在把这个队列容量设置为20. 我们可以看到这里它使用了20个线程。但是出了异常&#xff0c;这个后面我们会学习。 我们现在使用一下我们的callable&#xff1a; 一般我们如果是想在线程执行完以后&#xff0c;获得一个返回…

019 - C++ 中的局部静态(local static)

在前几期里&#xff0c;我们了解了static关键字在特定上下文中的含义。 今天我们看一看另一个环境。我们可以在局部作用域中使用 static 来声明一个变量。 这种情况和我们之前看到的两种static有点不同。这次的局部静态 Local static 有更多的含义。 声明一个变量&#xff0…

个人知识库(持续更新中)

打造一个属于自己的知识库 为什么会有这个知识库会记录什么内容基础知识Java核心Java WebMySQL 中间件&工具项目代码资源仿牛客社区Web开发华夏ERP软件 视频资源代码之外持续更新中… 为什么会有这个知识库 作为羊哥的死忠粉&#xff0c;当他谈到个人知识库这个东西的时候…

RS-485 基础知识:何时需要端接,以及如何正确端接

RS-485 网络的许多信号完整性和通信问题都源于端接&#xff0c;这可能是因为缺少端接或端接不正确。在 RS-485 基础知识系列的这一部分&#xff0c;我将讨论何时不需要端接 RS-485 网络&#xff0c;以及在需要端接时如何使用标准&#xff08;并联&#xff09;端接和交流电 (AC)…

【JavaEE】常见的锁策略与CAS的ABA问题

文章目录 1 常见的锁策略1.1 乐观锁与悲观锁1.2 轻量级锁与重量级锁1.3 自旋锁与挂起等待锁1.4 互斥锁与读写锁1.5 可重入锁与不可重入锁1.6 公平锁与非公平锁 2 CAS 操作2.1 CAS 简介2.2 CAS 的应用2.2.1 实现原子类2.2.2 实现自旋锁 3 CAS 的 ABA 问题写在最后 1 常见的锁策略…

Nacos 客户端的服务发现与服务订阅机制的纠缠 - 篇七

Nacos 客户端的服务发现与服务订阅机制的纠缠 - 篇七 历史篇章 &#x1f550;Nacos 客户端服务注册源码分析-篇一 &#x1f551;Nacos 客户端服务注册源码分析-篇二 &#x1f552;Nacos 客户端服务注册源码分析-篇三 &#x1f553;Nacos 服务端服务注册源码分析-篇四 &am…

最新入河排污口设置论证、水质影响预测与模拟、污水处理工艺分析及建设项目入河排污口方案报告书

随着水资源开发利用量不断增大&#xff0c;全国废污水排放量与日俱增&#xff0c;部分河段已远远超出水域纳污能力。近年来,部分沿岸入河排污口设置不合理&#xff0c;超标排污、未经同意私设排污口等问题逐步显现&#xff0c;已威胁到供水安全、水环境安全和水生态安全&#x…

ChatGPT探索系列之五:讨论人工智能伦理问题及ChatGPT的责任

文章目录 前言一、安全二、隐私和道德三、我们应该做什么总结 前言 ChatGPT发展到目前&#xff0c;其实网上已经有大量资料了&#xff0c;博主做个收口&#xff0c;会出一个ChatGPT探索系列的文章&#xff0c;帮助大家深入了解ChatGPT的。整个系列文章会按照一下目标来完成&am…