07 JSP

news2024/11/14 20:44:28

文章目录

  • 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 {
          @Override
          protected 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.jsp
              request.getRequestDispatcher("/el-demo.jsp").forward(request,response);
          }
      
          @Override
          protected 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. 获取SqlSession
              SqlSession sqlSession = factory.openSession();
              //3. 获取BrandMapper
              BrandMapper 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();
      
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
              //1. 调用BrandService完成查询
              List<Brand> brands = service.selectAll();
              //2. 存入request域中
              request.setAttribute("brands",brands);
              //3. 转发到brand.jsp
              request.getRequestDispatcher("/brand.jsp").forward(request,response);
          }
      
          @Override
          protected 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 mapper
              PUBLIC "-//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. 获取SqlSession
              SqlSession sqlSession = factory.openSession();
              //3. 获取BrandMapper
              BrandMapper 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();
      
          @Override
          protected 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. 转发到查询所有Servlet
              request.getRequestDispatcher("/selectAllServlet").forward(request,response);
          }
      
          @Override
          protected 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. 获取SqlSession
              SqlSession sqlSession = factory.openSession();
              //3. 获取BrandMapper
              BrandMapper 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();
      
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //1. 接收id
              String id = request.getParameter("id");
              //2. 调用service查询
              Brand brand = service.selectById(Integer.parseInt(id));
              //3. 存储到request中
              request.setAttribute("brand",brand);
              //4. 转发到update.jsp
              request.getRequestDispatcher("/update.jsp").forward(request,response);
          }
      
          @Override
          protected 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. 获取SqlSession
              SqlSession sqlSession = factory.openSession();
              //3. 获取BrandMapper
              BrandMapper 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();
      
          @Override
          protected 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. 转发到查询所有Servlet
              request.getRequestDispatcher("/selectAllServlet").forward(request,response);
          }
      
          @Override
          protected 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.coloradmin.cn/o/1950346.html

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

相关文章

11 逻辑运算符

逻辑运算符 and、or、not 常用来连接条件表达式构成更加复杂的条件表达式&#xff0c;并且 and 和 or 具有惰性求值或逻辑短路的特点&#xff0c;当连接多个表达式时只计算必须要计算的值。 运算符 and 和 or 并不一定会返回 True 或 False &#xff0c;而是得到最后一个被计算…

WordPress主题追格企业官网主题免费开源版V1.1.6

追格企业官网主题免费开源版由追格开发的一款开源wordpress主题&#xff0c;专为企业建站和追格企业官网小程序&#xff08;开源版&#xff09;PC配套而设计&#xff0c;功能集新闻动态、留言反馈、产品与服务、公司简介、联系我们等模块。

【MySQL进阶篇】锁:全局锁、表级锁以及行级锁

一、锁的概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须要解决的一个问题&am…

Apache Doris + Paimon 快速搭建指南|Lakehouse 使用手册(二)

湖仓一体&#xff08;Data Lakehouse&#xff09;融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势&#xff0c;帮助用户更加便捷地满足各种数据处理分析的需求。在过去多个版本中&#xff0c;Apache Doris 持续加深与数据湖的融合&#xff0c;已演进出一套成熟…

java学习--枚举

问题引入&#xff1a; 当需要解决一个季节类的问题&#xff0c;我们使用学到的类与对象&#xff0c;创建一个季节的类然后添加构造器在进行分装就可以实现&#xff0c;但问题也随之而来&#xff0c;这样不仅可以有正常的四季还可以添加其他不存在的四季以及可以更改四季的属性…

ElasticSearch学习篇15_《检索技术核心20讲》进阶篇之TopK检索

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 相关问题&#xff1a; ES全文检索是如何进行相关性打分的&#xff1f;ES中计算相关性得分的时机?如何加速TopK检索&#xff1f;三种思路 精准To…

广州数据中心机房服务器搬迁规划原则

数据中心机房搬迁&#xff0c;需要各个技术团队的紧密配合&#xff0c;制定详细周密的搬迁方案和实施流程&#xff0c;分批实施。作为华南地区主流的数据中心服务商&#xff0c;友力科技&#xff08;广州&#xff09;有限公司&#xff0c;专注数据中心机房服务器搬迁&#xff0…

[数据集][目标检测]蝗虫检测数据集VOC+YOLO格式1501张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1501 标注数量(xml文件个数)&#xff1a;1501 标注数量(txt文件个数)&#xff1a;1501 标注…

Python服务器和客户端功能库之websockets使用详解

概要 WebSockets 是一种在单个 TCP 连接上进行全双工通信的协议&#xff0c;特别适用于需要低延迟和高频率数据传输的实时应用&#xff0c;例如在线游戏、聊天应用和实时数据流。websockets 是一个基于 asyncio 的 Python 库&#xff0c;旨在提供简单易用的 WebSockets 服务器…

Linux进程信号详解【下】

&#x1f30e; Linux进程信号详【下】 文章目录&#xff1a; Linux信号详解 核心转储 信号保存       信号的三种状态       信号集操作函数         sigset_t类型接口         sigprocmask接口         sigpending接口         …

会员信息管理系统-计算机毕业设计源码38258

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3开发技术 1.3.1 Spring Boot框架 1.3.2 Java语言 1.3.3 MySQL数据库 1.4论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 登录流程 2.2.2数据删除流程 2.3 系统功能分析 2.4 系统用例分析…

我的世界!

每位冒险家在《我的世界》中的出生点都各不相同&#xff0c; 有的出生在桦木森林&#xff0c;有的出生在草原&#xff0c; 还有的出生在临近海洋的沙滩。 这些环境叫做生物群系&#xff0c;也常被称为生态系统。 在《我的世界》中的不同生物群系具有不同的地域特色—— 不…

TDS传感器

目录 一、实物图 二、原理图 引脚定义 模块特性 三 、简介 四、注意事项 源文件下载 可访问底部联系方式也可前往电子校园网官网搜索关键词 关键词&#xff1a; TDS传感器 一、实物图 二、原理图 引脚定义 …

稳定、低成本、兼容性强的无线串口通信选择-适用于多场景的高性能无线串口模块

LoRa610Pro是思为无线的一款无线串口通讯模块采用了先进的LoRa扩频调制跳频技术&#xff0c;高效的接收灵敏度&#xff0c;具有超强的抗干扰性&#xff0c;还增强了通信的穿透能力和距离&#xff0c;相较于传统的FSK和GFSK产品有明显的优势。 高效的接收灵敏度 由于采用了LoRa…

学习记录day19——数据结构 查找算法

概念 在给定数据元素的某个值&#xff0c;在查找表中确定一个其关键字等于给定值的数据元素的操作&#xff0c;叫做查找 查找的分类 顺序查找:将待查找数据&#xff0c;进行全部遍历一遍&#xff0c;直到找到要查找的元素 折半查找:每次都去除一半的查找范围的查找方式&#x…

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

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

PyQt5 + selenium,自动票务工具,演唱会门票,学习使用

PyQt5 selenium&#xff1b;在damai工具的基础上加入了UI界面&#xff0c;并将应用做了打包工作&#xff0c;主要是方便不会/不想折腾环境的用户使用&#xff0c;抢票的核心代码来自由于原作者不再维护&#xff0c;自己修改了部分代码。 安装教程 解压安装包到任意位置&…

U盘损坏无法访问?解锁两大高效数据恢复秘籍

U盘损坏之痛&#xff1a;数据失联的困境 在日常生活中&#xff0c;U盘作为数据交换与存储的重要工具&#xff0c;其便捷性无可替代。然而&#xff0c;当U盘遭遇损坏&#xff0c;无法被计算机正常访问时&#xff0c;存储在其中的宝贵数据仿佛一夜之间变得遥不可及&#xff0c;这…

关键词查找【Boyer-Moore 算法】

1、【Boyer-Moore 算法】 【算法】哪种算法有分数复杂度&#xff1f;- BoyerMoore字符串匹配_哔哩哔哩_bilibili BM算法的精华就在于BM(text, pattern),也就是BM算法当不匹配的时候一次性可以跳过不止一个字符。即它不需要对被搜索的字符串中的字符进行逐一比较&#xff0c;而…

云盘高速检测的秘密:密封圈外观检测全解析!

密封圈是一种用于填塞、隔离或密封两个相互连接部件之间空隙的圆形密封装置。密封圈通常由橡胶、塑料、金属等材料制成&#xff0c;具有弹性并能在压力作用下填充间隙&#xff0c;防止液体、气体或固体物质泄漏。 密封圈可根据具体应用选择不同材料&#xff0c;如橡胶密封圈适…