07 JSP

文章目录

  • JSP
    • 1、JSP 概述
    • 2、JSP 脚本和缺点
    • 3、EL 表达式
    • 4、JSTL标签
    • 5、MVC模式和三层架构
    • 6、案例

JSP

1、JSP 概述

  • JSP(全称:Java Server Pages):Java 服务端页面
    (1)是一种动态的网页技术
    (2)既可以定义 HTML、JS、CSS等静态内容,还可以定义 Java代码的动态内容
    (3)JSP = HTML + Java

  • JSP 快速入门

    • (1)搭建环境
      创建一个maven的 web 项目
      pom.xml 文件内容如下:

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>jsp-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin></plugins></build>
      </project>
      
      • (2)导入 JSP 依赖
      <dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope>
      </dependency>
      

      scope 必须设置为 provided, 因为tomcat 中有这个jar包了,不能将这个依赖打包进工程中

      • (3)创建 jsp 页面

      • 编写代码
        hello.jsp 页面中书写 HTML 标签和 Java 代码,如下

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head><title>Title</title>
      </head>
      <body><h1>hello jsp</h1><%System.out.println("hello,jsp~");%>
      </body>
      </html>
      
      • (5)测试
  • JSP 原理:JSP 本质上就是一个 Servlet

    访问jsp时的流程:

    1. 浏览器第一次访问 hello.jsp 页面
    2. tomcat 会将 hello.jsp 转换为名为 hello_jsp.java 的一个 Servlet
    3. tomcat 再将转换的 servlet 编译成字节码文件 hello_jsp.class
    4. tomcat 会执行该字节码文件,向外提供服务

2、JSP 脚本和缺点

  1. JSP 脚本分类
    JSP 脚本有如下三个分类:

    • <%…%>:内容会直接放到_jspService()方法之中
    • <%=…%>:内容会放到out.print()中,作为out.print()的参数
    • <%!…%>:内容会放到_jspService()方法之外,被类直接包含
  2. JSP 缺点
    由于 JSP页面内,既可以定义 HTML 标签,又可以定义 Java代码,造成了以下问题:

    • 书写麻烦:特别是复杂的页面既要写 HTML 标签,还要写 Java 代码
    • 阅读麻烦
    • 复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE…
    • 占内存和磁盘:JSP会自动生成.java和.class文件占磁盘,运行的是.class文件占内存
    • 调试困难:出错后,需要找到自动生成的.java文件进行调试
    • 不利于团队协作:前端人员不会 Java,后端人员不精 HTML
  3. 技术的发展
    JSP 已逐渐退出历史舞台,使用 HTML + Ajax 来替代

    1. 第一阶段:使用 servlet 即实现逻辑代码编写,也对页面进行拼接

    2. 第二阶段:随着技术的发展,出现了 JSP ,人们发现 JSP 使用起来比 Servlet 方便很多,但是还是要在 JSP 中嵌套 Java 代码,也不利于后期的维护

    3. 第三阶段:使用 Servlet 进行逻辑代码开发,而使用 JSP 进行数据展示

    4. 第四阶段:使用 servlet 进行后端逻辑代码开发,而使用 HTML 进行数据展示,由 ajax进行动态数据展示

3、EL 表达式

  1. 概述

    • EL(全称Expression Language )表达式语言

    • 用于简化 JSP 页面内的 Java 代码

    • EL 表达式的主要作用是 获取数据

    • 从域对象中获取数据,然后将数据展示在页面上

    • 语法:${expression}

      例如:${brands} 就是获取域中存储的 key 为 brands 的数据

  2. 代码演示

    • 定义servlet,在 servlet 中封装一些数据并存储到 request 域对象中并转发到 el-demo.jsp 页面

      @WebServlet("/demo1")
      public class ServletDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 准备数据List<Brand> brands = new ArrayList<Brand>();brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));//2. 存储到request域中request.setAttribute("brands",brands);//3. 转发到 el-demo.jsprequest.getRequestDispatcher("/el-demo.jsp").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
      }
      
    • el-demo.jsp 中通过 EL表达式 获取数据

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head><title>Title</title>
      </head>
      <body>${brands}
      </body>
      </html>
      
    • 在浏览器的地址栏输入 http://localhost:8080/jsp-demo/demo1 ,页面效果如下:

  3. 域对象
    JavaWeb中有四大域对象

    • page:当前页面有效
    • request:当前请求有效
    • session:当前会话有效
    • application:当前应用有效

      el 表达式获取数据,会依次从这4个域中寻找,直到找到为止

4、JSTL标签

  1. 概述
    JSP标准标签库(Jsp Standarded Tag Library) ,使用标签取代JSP页面上的Java代码

  2. JSTL 使用步骤:

    • 导入坐标
      <dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version>
      </dependency>
      <dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version>
      </dependency>
      
    • 在JSP页面上引入JSTL标签库
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
      
    • 使用标签
  3. if 标签
    <c:if>:相当于 if 判断,属性:test,用于定义条件表达式

    <c:if test="${flag == 1}"></c:if>
    <c:if test="${flag == 2}"></c:if>
    
  4. forEach 标签
    <c:forEach>:相当于 for 循环。java中有增强for循环和普通for循环,JSTL 中的 <c:forEach> 也有两种用法

    • 用法一
      • items:被遍历的容器
      • var:遍历产生的临时变量
      • varStatus:遍历状态对象
      <c:forEach items="${brands}" var="brand">    <tr align="center">        <td>${brand.id}</td>        <td>${brand.brandName}</td>        <td>${brand.companyName}</td>       <td>${brand.description}</td>    </tr>
      </c:forEach>
      
    • 用法二
      • begin:开始数
      • end:结束数
      • step:步长
      <c:forEach begin="0" end="10" step="1" var="i">${i}
      </c:forEach>
      

5、MVC模式和三层架构

  1. MVC模式
    MVC 是一种分层开发的模式,其中:

    • M:Model,业务模型,处理业务
    • V:View,视图,界面展示
    • C:Controller,控制器,处理请求,调用模型和视图

      控制器(serlvlet)用来接收浏览器发送过来的请求,控制器调用模型(JavaBean)来获取数据,比如从数据库查询数据;控制器获取到数据后再交由视图(JSP)进行数据展示
    • MVC 好处:
      • 职责单一,互不影响。每个角色做它自己的事,各司其职。
      • 有利于分工协作。
      • 有利于组件重用
  2. 三层架构

    • 数据访问层:对数据库的CRUD基本操作

    • 业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能。例如 注册业务功能 ,我们会先调用 数据访问层selectByName() 方法判断该用户名是否存在,如果不存在再调用 数据访问层insert() 方法进行数据的添加操作

    • 表现层:接收请求,封装数据,调用业务逻辑层,响应数据

    • 三层架构的每一层都有特有的包名称:

      • 表现层: com.itheima.controller 或者 com.itheima.web
      • 业务逻辑层:com.itheima.service
      • 数据访问层:com.itheima.dao 或者 com.itheima.mapper
  3. MVC 和 三层架构
    三层架构 是对 MVC 模式 实现架构的思想

6、案例

  1. 需求:完成品牌数据的增删改查操作

  2. 环境准备

    • 创建新的模块 brand_demo,引入坐标
    • 创建三层架构的包结构
    • 数据库表 tb_brand
    • 实体类 Brand
    • MyBatis 基础环境
      • Mybatis-config.xml
      • BrandMapper.xml
      • BrandMapper接口
    • 编写工具类
  3. 查询所有

    • (1)编写BrandMapper
      mapper 包下创建创建 BrandMapper 接口,在接口中定义 selectAll() 方法

      @Select("select * from tb_brand")
      List<Brand> selectAll();
      
    • (2) 编写BrandService

      public class BrandService {SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();/*** 查询所有* @return*/public List<Brand> selectAll(){//调用BrandMapper.selectAll()//2. 获取SqlSessionSqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);//4. 调用方法List<Brand> brands = mapper.selectAll();sqlSession.close();return brands;}
      }
      
    • (3) 编写Servlet
      web 包下创建名为 SelectAllServletservlet,该 servlet 的逻辑如下:

      • 调用 BrandServiceselectAll() 方法进行业务逻辑处理,并接收返回的结果
      • 将上一步返回的结果存储到 request 域对象中
      • 跳转到 brand.jsp 页面进行数据的展示
      @WebServlet("/selectAllServlet")
      public class SelectAllServlet extends HttpServlet {private  BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 调用BrandService完成查询List<Brand> brands = service.selectAll();//2. 存入request域中request.setAttribute("brands",brands);//3. 转发到brand.jsprequest.getRequestDispatcher("/brand.jsp").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
      }
      
    • (4)编写brand.jsp页面

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html>
      <html lang="en">
      <head><meta charset="UTF-8"><title>Title</title>
      </head>
      <body>
      <hr>
      <table border="1" cellspacing="0" width="80%"><tr><th>序号</th><th>品牌名称</th><th>企业名称</th><th>排序</th><th>品牌介绍</th><th>状态</th><th>操作</th></tr><c:forEach items="${brands}" var="brand" varStatus="status"><tr align="center"><%--<td>${brand.id}</td>--%><td>${status.count}</td><td>${brand.brandName}</td><td>${brand.companyName}</td><td>${brand.ordered}</td><td>${brand.description}</td><c:if test="${brand.status == 1}"><td>启用</td></c:if><c:if test="${brand.status != 1}"><td>禁用</td></c:if><td><a href="/brand-demo/selectByIdServlet?id=${brand.id}">修改</a> <a href="#">删除</a></td></tr></c:forEach>
      </table>
      </body>
      </html>
      
    • (5)测试

      使用 resultMap 标签定义映射关系

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="com.itheima.mapper.BrandMapper"><resultMap id="brandResultMap" type="brand"><result column="brand_name" property="brandName"></result><result column="company_name" property="companyName"></result></resultMap>
      </mapper>
      

      并且在 BrandMapper 接口中的 selectAll() 上使用 @ResuleMap 注解指定使用该映射

      /*** 查询所有* @return*/
      @Select("select * from tb_brand")
      @ResultMap("brandResultMap")
      List<Brand> selectAll();
      

  4. 添加

    • (1)编写BrandMapper方法
      BrandMapper 接口,在接口中定义 add(Brand brand) 方法

      @Insert("insert into tb_brand values(null,#{brandName},#{companyName},#{ordered},#{description},#{status})")
      void add(Brand brand);
      
    • (2)编写BrandService方法
      BrandService 类中定义添加品牌数据方法 add(Brand brand)

      public void add(Brand brand){//2. 获取SqlSessionSqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);//4. 调用方法mapper.add(brand);//提交事务sqlSession.commit();//释放资源sqlSession.close();}
      
    • (3)编写servlet
      web 包下创建 AddServletservlet,该 servlet 的逻辑如下:

      • 设置处理post请求乱码的字符集
      • 接收客户端提交的数据
      • 将接收到的数据封装到 Brand 对象中
      • 调用 BrandServiceadd() 方法进行添加的业务逻辑处理
      • 跳转到 selectAllServlet 资源重新查询数据
      @WebServlet("/addServlet")
      public class AddServlet extends HttpServlet {private BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//处理POST请求的乱码问题request.setCharacterEncoding("utf-8");//1. 接收表单提交的数据,封装为一个Brand对象String brandName = request.getParameter("brandName");String companyName = request.getParameter("companyName");String ordered = request.getParameter("ordered");String description = request.getParameter("description");String status = request.getParameter("status");//封装为一个Brand对象Brand brand = new Brand();brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setOrdered(Integer.parseInt(ordered));brand.setDescription(description);brand.setStatus(Integer.parseInt(status));//2. 调用service 完成添加service.add(brand);//3. 转发到查询所有Servletrequest.getRequestDispatcher("/selectAllServlet").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
      }
      
    • (4)编写addBrand.jsp页面

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <!DOCTYPE html>
      <html lang="en"><head><meta charset="UTF-8"><title>添加品牌</title>
      </head>
      <body>
      <h3>添加品牌</h3>
      <form action="/brand-demo/addServlet" method="post">品牌名称:<input name="brandName"><br>企业名称:<input name="companyName"><br>排序:<input name="ordered"><br>描述信息:<textarea rows="5" cols="20" name="description"></textarea><br>状态:<input type="radio" name="status" value="0">禁用<input type="radio" name="status" value="1">启用<br><input type="submit" value="提交">
      </form>
      </body>
      </html>
      
    • (5)修改brand.jsp页面
      添加 新增 按钮

      <input type="button" value="新增" id="add"><br>
      

      并给该按钮绑定单击事件,当点击了该按钮需要跳转到 brand.jsp 添加品牌数据的页面

      <script>document.getElementById("add").onclick = function (){location.href = "/brand-demo/addBrand.jsp";}
      </script>
      
    • (6) 测试

  5. 修改 - 回显数据

    • (1)编写BrandMapper方法
      BrandMapper 接口,在接口中定义 selectById(int id) 方法

       @Select("select * from tb_brand where id = #{id}")@ResultMap("brandResultMap")Brand selectById(int id);
      
    • (2)编写BrandService方法
      BrandService 类中定义根据id查询数据方法 selectById(int id)

      public Brand selectById(int id){//调用BrandMapper.selectAll()//2. 获取SqlSessionSqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);//4. 调用方法Brand brand = mapper.selectById(id);sqlSession.close();return brand;}
      
    • (3)编写servlet
      web 包下创建 SelectByIdServletservlet,该 servlet 的逻辑如下

      • 获取请求数据 id
      • 调用 BrandServiceselectById() 方法进行数据查询的业务逻辑
      • 将查询到的数据存储到 request 域对象中
      • 跳转到 update.jsp 页面进行数据真实
      @WebServlet("/selectByIdServlet")
      public class SelectByIdServlet extends HttpServlet {private  BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 接收idString id = request.getParameter("id");//2. 调用service查询Brand brand = service.selectById(Integer.parseInt(id));//3. 存储到request中request.setAttribute("brand",brand);//4. 转发到update.jsprequest.getRequestDispatcher("/update.jsp").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
      }
      
    • (4)编写update.jsp页面
      拷贝 addBrand.jsp 页面,改名为 update.jsp 并做出以下修改:

      • title 标签内容改为 修改品牌
      • form 标签的 action 属性值改为 /brand-demo/updateServlet
      • input 标签要进行数据回显,需要设置 value 属性
      • textarea 标签要进行数据回显,需要在标签体中使用 EL表达式
      • 单选框使用 if 标签需要判断 brand.status 的值是 1 还是 0 在指定的单选框上使用 checked 属性,表示被选中状态
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <!DOCTYPE html>
      <html lang="en">
      <head><meta charset="UTF-8"><title>修改品牌</title>
      </head>
      <body>
      <h3>修改品牌</h3>
      <form action="/brand-demo/updateServlet" method="post">品牌名称:<input name="brandName" value="${brand.brandName}"><br>企业名称:<input name="companyName" value="${brand.companyName}"><br>排序:<input name="ordered" value="${brand.ordered}"><br>描述信息:<textarea rows="5" cols="20" name="description">${brand.description} </textarea><br>状态:<c:if test="${brand.status == 0}"><input type="radio" name="status" value="0" checked>禁用<input type="radio" name="status" value="1">启用<br></c:if><c:if test="${brand.status == 1}"><input type="radio" name="status" value="0" >禁用<input type="radio" name="status" value="1" checked>启用<br></c:if><input type="submit" value="提交">
      </form>
      </body>
      </html>
      
    • (5)测试

  6. 修改 - 修改数据

    • (1)编写BrandMapper方法
      BrandMapper 接口,在接口中定义 update(Brand brand) 方法

      @Update("update tb_brand set brand_name = #{brandName},company_name = #{companyName},ordered = #{ordered},description = #{description},status = #{status} where id = #{id}")
      void update(Brand brand);
      
    • (2)编写BrandService方法
      BrandService 类中定义根据id查询数据方法 update(Brand brand)

      public void update(Brand brand){//2. 获取SqlSessionSqlSession sqlSession = factory.openSession();//3. 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);//4. 调用方法mapper.update(brand);//提交事务sqlSession.commit();//释放资源sqlSession.close();}
      
    • (3)编写servlet
      web 包下创建 AddServletservlet,该 servlet 的逻辑如下:

      • 设置处理post请求乱码的字符集
      • 接收客户端提交的数据
      • 将接收到的数据封装到 Brand 对象中
      • 调用 BrandServiceupdate() 方法进行添加的业务逻辑处理
      • 跳转到 selectAllServlet 资源重新查询数据
      @WebServlet("/updateServlet")
      public class UpdateServlet extends HttpServlet {private BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//处理POST请求的乱码问题request.setCharacterEncoding("utf-8");//1. 接收表单提交的数据,封装为一个Brand对象String id = request.getParameter("id");String brandName = request.getParameter("brandName");String companyName = request.getParameter("companyName");String ordered = request.getParameter("ordered");String description = request.getParameter("description");String status = request.getParameter("status");//封装为一个Brand对象Brand brand = new Brand();brand.setId(Integer.parseInt(id));brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setOrdered(Integer.parseInt(ordered));brand.setDescription(description);brand.setStatus(Integer.parseInt(status));//2. 调用service 完成修改service.update(brand);//3. 转发到查询所有Servletrequest.getRequestDispatcher("/selectAllServlet").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
      }
      
    • (4)修改update.jsp
      update.jsp 页面的表单中添加如下代码:

      <%--隐藏域,提交id--%>
      <input type="hidden" name="id" value="${brand.id}">
      
    • (5)测试

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

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

相关文章

【C++高阶】哈希之美:探索位图与布隆过滤器的应用之旅

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;模拟实现unordered 的奥秘 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀哈希应用 &#x1f4…

大模型llama结构技术点分享;transformer模型常见知识点nlp面经

1、大模型llama3技术点 参考&#xff1a;https://www.zhihu.com/question/662354435/answer/3572364267 Llama1-3&#xff0c;数据tokens从1-2T到15T;使用了MHA&#xff08;GQA缓存&#xff09;&#xff1b;上下文长度从2-4-8K&#xff1b;应用了强化学习对其。 1、pretraini…

分布式事务(典型的分布式事务场景+CAP+解决方案)

分布式事务与分布式锁的区别&#xff1a; 分布式锁解决的是分布式资源抢占的问题&#xff1b;分布式事务和本地事务是解决流程化提交问题。 SQL中的4个事务隔离级别&#xff1a;&#xff08;1&#xff09;读未提交&#xff08;2&#xff09;读已提交&#xff08;3&#xff09…

如何远程开发完整分析一台新能源车BMS电池管理系统CAN数据矩阵

随着我国新能源汽车的崛起&#xff0c;从网络管理平台、数据中心、科研机构、高校教学、车型对标、整车DBC控制策略分析、电池管理系统研究、电池健康管理、网约车管理、电池梯度利用、车队管理等多方面的市场需求&#xff0c;完整分析一台新能源车BMS电池管理系统的CAN矩阵开发…

【深度学习】yolov8-seg分割训练,拼接图的分割复原

文章目录 项目背景造数据训练 项目背景 在日常开发中&#xff0c;经常会遇到一些图片是由多个图片拼接来的&#xff0c;如下图就是三个图片横向拼接来的。是否可以利用yolov8-seg模型来识别出这张图片的三张子图区域呢&#xff0c;这是文本要做的事情。 造数据 假设拼接方式有…

Oracle配置TCPS加密协议测试

文章目录 一、环境信息二、配置过程1.创建证书2.监听配置2.1.配置sqlnet.ora2.2.配置listener.ora文件2.3.配置tnsnames.ora文件2.4.重载监听 3.数据库本地测试3.1. tcps登录测试3.2.日志监控 一、环境信息 操作系统&#xff1a;Linux 版本信息&#xff1a;Oracle 19c 参考文档…

缓存框架 Caffeine 的可视化探索与实践

作者&#xff1a;vivo 互联网服务器团队- Wang Zhi Caffeine 作为一个高性能的缓存框架而被大量使用。本文基于Caffeine已有的基础进行定制化开发实现可视化功能。 一、背景 Caffeine缓存是一个高性能、可扩展、内存优化的 Java 缓存库&#xff0c;基于 Google 的 Guava Cac…

Ubuntu20.04 设置静态ip

Ubuntu 从 17.10 开始&#xff0c;已放弃在 /etc/network/interfaces 里固定 IP 的配置&#xff0c;interfaces 文件不复存在&#xff0c;即使配置也不会生效&#xff0c;而是改成 netplan 方式 &#xff0c;配置写在 /etc/netplan/01-netcfg.yaml &#xff0c;50-cloud-init.y…

机器学习笔记-02-基础线性算法认识(问题-解答自查版)

前言 以下问题以Q&A形式记录&#xff0c;基本上都是笔者在初学一轮后&#xff0c;掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系&#xff0c;也适合做查漏补缺和复盘。 本文可以让读者用作自查&#xff0c;答案在后面&#xff0…

跟《经济学人》学英文:2024年07月20日这期 At last, Wall Street has something to cheer

At last, Wall Street has something to cheer 华尔街终于有值得欢呼的事情了 at last&#xff1a;终于&#xff1b;最后&#xff1b; Consumer banks, on the other hand, are starting to suffer 原文&#xff1a; Capital markets are twitchy. When interest rates spi…

数据危机!4大硬盘数据恢复工具,教你如何正确挽回珍贵记忆!

在这个数字化的时代&#xff0c;硬盘里的数据对我们来说简直太重要了。但糟糕的是&#xff0c;数据丢失这种事时不时就会发生&#xff0c;可能是因为不小心删了&#xff0c;硬盘坏了&#xff0c;或者中了病毒。遇到这种情况&#xff0c;很多人可能就慌了&#xff0c;不知道怎么…

货架管理a

路由->vue的el标签->Api->call方法里calljs的api接口->数据声明const xxxData-> 编辑按钮:点击跳出页面并把这一行的数据给到表单formDataba2 保存按钮:formDataba2改过的数据->xxApi发送->查询Api 跳转仓库:把tableData.value数据清空->callXxxAp…

Windows环境下安装Redis并设置Redis开机自启

文章目录 0. 前言1. 下载 Windows 版本的Redis2. 为 Redis 设置连接密码&#xff08;可选&#xff09;3. 启动 Redis4. 设置 Redis 开机自启4.1 将 Redis 进程注册为服务4.2 设置 Redis 服务开机自启4.3 重启电脑测试是否配置成功4.4 关闭 Redis 开机自启&#xff08;拓展&…

Typora笔记上传到CSDN

1.Typora 安装 Typora链接&#xff1a;百度网盘 提取码&#xff1a;b6d1 旧版本是不需要破解的 后来的版本比如1.5.9把放在typora的根目录下就可以了 2.上传到CSDN 步骤 csdn 写文章-使用MD编辑器-导入本地md文件即可 问题 图片没法显示 原因 图片的链接是本地的 当然没法…

Ubuntu 24 PXE Server bios+uefi 自动化部署esxi 6 7 8

pxe server 前言 PXE(Preboot eXecution Environment,预启动执行环境)是一种网络启动协议,允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器,它提供了启动镜像和引导加载程序,使得客户端计算机可以通过网络启动并安装操作系统或运行其他软件…

java学习记录09:Lambda表达式与引用

Lambda表达式 例子&#xff1a; &#xff08;o1&#xff0c;o2&#xff09; -> Interger.compare(o1,o2); 格式&#xff1a; -> : lambda操作符 -> 的左边: lambda形参列表&#xff0c;对应着要重写的接口中的抽象方法的形参列表。 ->的右边&#xff1a;lamb…

python编程表白爱心代码,来自程序员的浪漫!

Python爱心表白代码 感觉的紫色要更加浪漫&#xff0c;其中的文字也是可以直接更改的&#xff0c;非常方便 <文末附带精品籽料> 改变爱心的颜色: 在源代码的13-15行位置&#xff0c;可以通过更改16进制颜色色值进行改变爱心的颜色&#xff0c;这里小编改了一点绿色&…

阶层差异下的社会角色与认知逻辑

阶层差异下的社会角色与认知逻辑 在中国传统文化中&#xff0c;有句古话&#xff1a;“仗义每从屠狗辈&#xff0c;负心多是读书人。”这句话揭示了不同社会阶层的人&#xff0c;在认知和行为上存在的差异。 社会底层&#xff1a;道德与情感的坚守者 社会底层人群&#xff0c…

05 循环神经网络

目录 1. 基本概念 2. 简单循环网络 2.1 简单循环网络 2.2 长程依赖问题 3. 循环神经网络的模式与参数学习 3.1 循环神经网络的模式 3.2 参数学习 4. 基于门控的循环神经网络 4.1 长短期记忆网络 4.2 LSTM网络的变体网络 4.3 门控循环单元网络 5. 深层循环神经网络…

PCL Local Surface Patches 关键点提取

目录 一、算法原理1、算法原理2、 参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、算法原理 主曲率是某一点局部形状的体现,Local Surface Patches 关键点检测法…