当前位置: 首页 > news >正文

4.Java Web开发模式(javaBean+servlet+MVC)

Java Web开发模式

一、Java Web开发模式

1.javaBean简介

JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。 --from 维基百科

JavaBean是一种可重复使用、且跨平台的软件组件。JavaBean可分为两种:

  • 一种是有用户界面(UI,User Interface)的JavaBean;
  • 另一种是没有用户界面,==主要负责处理事务(如数据运算,操纵数据库)的JavaBean
1)特点:
  1. JavaBean是一种Java类,而且是一种特殊的、可重用的类。
  2. JavaBean必须具有无参数的构造器,所有的属性都是private的,通过提供setter和getter方法来实现对成员属性的访问。
  3. Javabean 是为了和 jsp 页面传数据化简交互过程而产生的。

2.开发模式分类

  • 模式一(JSP+JavaBean): 简便、灵活,在小规模、业务逻辑简单的项目开发中有一定优势,开发效率高

    JSP页面通过JavaBean处理数据,响应请求并返回结果

  • 模式二(JSP+Servlet+JavaBean): 程序层次清晰、分工明确,可维护性、扩展性高,尤其在规模较大或是业务逻辑复杂的项目中倾向使用

1)模式一特点
  • 模式 一 体系结构用于开发简单的应用程序
  • 模式 一体系结构包括多个用户可与之交互的页面
  • 客户端能够直接访问到服务器上的JSP页面
  • 在采用模式 一 开发的Web 应用程序中混杂了大量的业务逻辑代码,HTML内容、Java代码交织在一起,使程序的维护性和扩展性较差
  • 在JSP页面中可以通过链接等方式直接转向其他页面。在业务逻辑较为复杂的项目中管理页面流程较为困难。
2)模式二特点

模式 二 体系结构结合使用 JSP 页面、Servlet和 JavaBean 来开发 Web 应用程序

二、MVC模式

1.简介

MVC是英文“Model-View-Controller”的缩写,最初是在Smalltalk-80中被用来构建用户界面的。其中M代表模型Model,V代表视图View,C代表控制器Controller。

通过模型视图控制器来

采用MVC模式的目的,就是为了增加代码的重用率,减少数据表达、数据描述和提高应用操作的偶合度。同时也使得软件的可维护性、可修复性、可扩展性、灵活性以及封装性大大提高。

2.MVC模式结构

MVC,把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用将被分成三层:模型层、视图层、控制层。

  1. 输入>>模型层(Model)
  2. 处理>>视图层(View)
  3. 输出>>控制层(Controller)

controller负责处理客户端发送的请求,经过service层业务处理并间接调用mapper接口层的数据库操作,后将结果返回给视图层

客户端请求>>controller>>service>>mapper

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1)Model层

分为: DAO层、service层

  1. DAO层:

    负责访问数据库进行数据的操作,取得结果集之后将结果集中的数据取出封装到VO类对象之后返回给service层

    负责数据库操作,取得结果返回给service层

    public interface HrMapper {int deleteByPrimaryKey(Long id);int insert(Hr record);int insertSelective(Hr record);Hr selectByPrimaryKey(Long id);int updateByPrimaryKeySelective(Hr record);int updateByPrimaryKey(Hr record);Hr login(@Param("username") String username, @Param("password") String password);List<Hr> queryAll();List<Hr> queryByUsername(String username);
    }
    
  2. service层:

    主要负责一些业务处理,比如多个操作需要放在一个事务中进行管理,事务回滚,一些复杂的逻辑业务处理就放到service层

    通过调用DAO层接口实现业务功能

    Service层的业务实现,具体要调用到已定义的DAO层的接口。封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性。

    @Service("hrService")
    public class HrServiceImpl implements HrService {@Autowiredprivate HrMapper hrMapper;@Overridepublic Hr login(String username, String password) {return hrMapper.login(username, password);}@Overridepublic List<Hr> queryAll() {return hrMapper.queryAll();}@Overridepublic int insertSelective(Hr record) {return hrMapper.insertSelective(record);}@Overridepublic int deleteByPrimaryKey(Long id) {return hrMapper.deleteByPrimaryKey(id);}@Overridepublic Hr selectByPrimaryKey(Long id) {return hrMapper.selectByPrimaryKey(id);}@Overridepublic int updateByPrimaryKeySelective(Hr record) {return hrMapper.updateByPrimaryKeySelective(record);}@Overridepublic  List<Hr>queryByUsername(String username) {return hrMapper.queryByUsername(username);}
    }
    
2)View层

负责处理用户界面的显示细节,以及如何向用户展示业务处理的结果(页面效果)

<%@ page import="com.woniuxy.hrms.entity.Hr" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><%String path = request.getContextPath();String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<base href="<%=basePath%>"/>
<!DOCTYPE html><head><meta charset="UTF-8"><title>Title</title>
</head>
<link rel="stylesheet" type="text/css" href="static/bootstrap/css/bootstrap.min.css"><script type="text/javascript" src="static/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="static/bootstrap/js/jquery.min.js"></script>
<script type="text/javascript">function check(id) {var flag = confirm("确认要删除吗?");if (flag) {//删除确认,服务器请求跳转至delete方法处理数据库数据location.href = "hr/delete?id=" + id;}}
</script><body>
<div class="container" style="padding-top: 40px;"><div class="form-group"><div class="row"><div class="col-md-8"><form id="searchForm" action="hr/queryByUsername" method="post"><input type="text" class="form-control" id="selectUserName" name="username"placeholder="请输入用户名"/><button type="submit" class="btn btn-danger search" id="searchBtn">搜索</button></form></div><div class="col-md-3"><a class="btn btn-round btn-square btn-default" href="manage/hr/add.jsp">添加<iclass="mdi mdi-eye"></i></a><!--  <button class="btn btn-default add" data-toggle="modal" data-target="#addModel">增加</button>--></div></div></div><%List<Hr> list = (List<Hr>) request.getAttribute("list");%><table class="table table-bordered text-center"><tr><td>编号</td><td>姓名</td><td>用户名</td><td>电话</td><td>地址</td><td>操作</td></tr><%--        迭代集合--%><%for (Hr hr : list) {%><tr><td><%=hr.getId()%></td><td><%=hr.getRealName()%></td><td><%=hr.getUsername()%></td><td><%=hr.getPhone()%></td><td><%=hr.getAddress()%></td><td><%--                点击编辑链接,传递当前对象id,并向服务器发送请求--%><%-- href="hrms/queryById?id=<%=hr.getId()%        查询字符串以?字符开始       --%><%--                <%=hr.getId()%>jsp脚本表达式    --%><a class="btn btn-round btn-square btn-info" href="hr/queryById?id=<%=hr.getId()%>">编辑<iclass="mdi mdi-eye"></i></a><a class="btn btn-round btn-square btn-warning" href="javascript:check(<%=hr.getId()%>)">删除<iclass="mdi mdi-eye"></i></a></td></tr><%}%></table>
</div>
</body>
</html>
3)Cotroller层

处理客户端请求

叫做控制层,主要的功能是处理用户发送的请求。

负责协调视图与模型,在两者之间处于桥梁和纽带的位置

public class BaseServlet extends HttpServlet {//HttpServlet生命周期: 初始化init(),服务运行service(),销毁destroy()//1.init()仅加载一次//2.service()随时响应客户端请求,每次获取请求对象调用此方法//3.destroy()仅调用一次, 释放servlet所占用的资源。如关闭文件输入输出流,关闭与数据库的连接。//多次调用,每次服务器获取请求对象调用service方法,随时响应客户端请求@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求路径String requestURI = req.getRequestURI();//检索请求路径最后的方法名String methodName = requestURI.substring(requestURI.lastIndexOf("/") + 1);Method declaredMethod;try {//动态调用对象方法declaredMethod = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);declaredMethod.invoke(this, req, resp);} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {throw new RuntimeException(e);}}
}
@WebServlet(value = "/hr/*", loadOnStartup = 1)
public class HrServlet extends BaseServlet {HrService hrService;@Overridepublic void init(ServletConfig config) throws ServletException {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");//config.getServletContext()创建ServletContext对象,用来存储applicationContext对象,整个Web应用范围内访问它config.getServletContext().setAttribute("applicationContext", applicationContext);hrService = applicationContext.getBean("hrService", HrService.class);}protected void queryByUsername(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");List<Hr> list = hrService.queryByUsername(username);list.forEach(System.out::println);req.setAttribute("list", list);req.getRequestDispatcher("../manage/hr/show.jsp").forward(req, resp);}protected void queryAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {List<Hr> list = hrService.queryAll();req.setAttribute("list", list);req.getRequestDispatcher("../manage/hr/show.jsp").forward(req, resp);}protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        req.setCharacterEncoding("utf-8");Hr hr = new Hr();hr.setRealName(req.getParameter("realName"));hr.setUsername(req.getParameter("username"));hr.setAddress(req.getParameter("address"));hr.setPhone(req.getParameter("phone"));System.out.println(hr);int i = hrService.insertSelective(hr);//数据库添加数据,并重新调用queryAll走页面展示流程queryAll(req, resp);}protected void queryById(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String id = req.getParameter("id");Hr hr = hrService.selectByPrimaryKey(Long.parseLong(id));req.setAttribute("hr", hr);
//        跳转页面,带着对象forward(),地址栏不变req.getRequestDispatcher("../manage/hr/update.jsp").forward(req, resp);
//        单纯跳转页面,并不能携带对象,地址栏更新
//        resp.sendRedirect("/hr/update.jsp");}protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        req.setCharacterEncoding("utf-8");Hr hr = new Hr();//更新必须有id,负责更新所有内容,依据id更新//  where dept_id = #{deptId,jdbcType=INTEGER}//获取页面update.jsp请求对象传递的参数hr.setId(Integer.parseInt(req.getParameter("id")));hr.setRealName(req.getParameter("realName"));hr.setUsername(req.getParameter("username"));hr.setAddress(req.getParameter("address"));hr.setPhone(req.getParameter("phone"));int update = hrService.updateByPrimaryKeySelective(hr);//更新完显示全部数据(查询全部数据反馈给show.jsp)queryAll(req, resp);}protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String id = req.getParameter("id");hrService.deleteByPrimaryKey(Long.parseLong(id));queryAll(req, resp);}protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//负责处理login.jsp提交//获取提交对象的username和passwordString username = req.getParameter("username");String password = req.getParameter("password");Hr hr = hrService.login(username, password);//HttpSession session = req.getSession();session.setAttribute("hr", hr);if (hr != null) {//本地存储,在浏览器存储数据Cookie[] cookies = req.getCookies();boolean flag = false;for (Cookie cookie : cookies) {String name = cookie.getName();if (name.equals("username")) {flag = true;}}if (!flag) {Cookie username1 = new Cookie("username", username);Cookie password1 = new Cookie("password", password);//设置cookie存储路径username1.setPath("/hrms");password1.setPath("/hrms");username1.setMaxAge(60 * 60 * 24);password1.setMaxAge(60 * 60 * 24);resp.addCookie(username1);resp.addCookie(password1);}//路径可以: ../或/hrms根路径下的页面resp.sendRedirect("/hrms/admin.jsp");} else {resp.sendRedirect("../login.jsp");}}
}

3.MVC的优点:

  • 1、耦合性低

    视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。

  • 2、重用性高

    MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。

  • 3、部署快,生命周期成本低

    MVC使开发和维护用户接口的技术含量降低。使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。

  • 4、可维护性高

    分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。

4.MVC框架

  1. Struts2框架:Struts2是基于MVC的轻量级的web应用框架

规则。

  • 2、重用性高

    MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。

  • 3、部署快,生命周期成本低

    MVC使开发和维护用户接口的技术含量降低。使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。

  • 4、可维护性高

    分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。

4.MVC框架

  1. Struts2框架:Struts2是基于MVC的轻量级的web应用框架

  2. SpringMVC:Spring家族产品,我们后期重点使用的框架

相关文章:

4.Java Web开发模式(javaBean+servlet+MVC)

Java Web开发模式 一、Java Web开发模式 1.javaBean简介 JavaBeans是Java中一种特殊的类&#xff0c;可以将多个对象封装到一个对象&#xff08;bean&#xff09;中。特点是可序列化&#xff0c;提供无参构造器&#xff0c;提供getter方法和setter方法访问对象的属性。名称中…...

centos7 mysql 基本测试(6)主从简单测试

centos7 xtrabackup mysql 基本测试&#xff08;6&#xff09;主从简单测试 mysql -u etc -p 1234aA~1 参考&#xff1a; centos7 时区设置 时间同步 https://blog.csdn.net/wowocpp/article/details/135931129 Mysql数据库&#xff1a;主从复制与读写分离 https://blog.csd…...

信息安全工程师题

防火墙安全策略有两种类型&#xff1a;白名单策略、黑名单策略白名单策略&#xff1a;只允许符合安全规则的包通过防火墙&#xff0c;其他通信包禁止黑名单策略&#xff1a;禁止与安全规则相冲突的包通过防火墙&#xff0c;其他通信包允许实现网络地址转换的方式主要有静态NAT、…...

springcloud rocketmq 新增的消费者组从哪里开始消费

如果新建一个新的消费者组&#xff0c;是否会消费历史消息&#xff0c;导致重复消费&#xff1f; 直接在 console 界面新增消费者组&#xff0c;但是没有办法绑定订阅关系&#xff0c;没有找到入口&#xff0c;在 控制台项目源码 rocketmq-externals 也没有找到可以确定订阅关系…...

Redis-缓存

什么是缓存&#xff1f; 缓存就像自行车和越野车的避震器&#xff0c;降低硬着陆造成的损害 缓存就是系统的避震器&#xff0c;,防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数…...

MySQL练习05

题目 步骤 触发器 use mydb16_trigger; #使用数据库create table goods( gid char(8) primary key, name varchar(10), price decimal(8,2), num int);create table orders( oid int primary key auto_increment, gid char(10) not null, name varchar(10), price decima…...

[C++][STL源码剖析] 详解AVL树的实现

目录 1.概念 2.实现 2.1 初始化 2.2 插入 2.2.1 旋转&#xff08;重点&#xff09; 左单旋 右单旋 双旋 2.❗ 双旋后&#xff0c;对平衡因子的处理 2.3 判断测试 完整代码&#xff1a; 拓展&#xff1a;删除 1.概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但…...

Kubernetes存储 - Node本地存储卷

官方文档 Kubernetes管理的Node本地存储目前有三种&#xff0c;分别是EmptyDir,HostPath,Local&#xff0c;EmptyDir是一种与Pod同生命周期的Node临时存储&#xff1b;HostPath是Node的目录&#xff1b;Local是基于持久卷(PV)管理的Node目录。接下来详细说明这几种类型如何以存…...

Cocos Creator2D游戏开发-(2)Cocos 常见名词

场景&#xff08;Scene): 它一个容器&#xff0c;容纳游戏中的各个元素&#xff0c;如精灵&#xff0c;标签&#xff0c;节点对象。它负责着游戏的运行逻辑&#xff0c;以帧为单位渲染这些内容。就是你理解到的那个场景; 个人理解就是一个画面, 一个游戏不同的关卡,会有不同的…...

【不同设备间的数据库连接】被连接设备如何开权限给申请连接的设备

为了方便叙述&#xff0c;简称申请连接数据库的设备为a&#xff0c;被连接的为b 1.确保在同一局域网下&#xff0c;检查a的ip 如果你设置的动态ip&#xff0c;那么每重启一次这个ip都会变。两种选择&#xff0c;每次都给b同步一下你的最新ip&#xff0c;或者a设置成静态ip。具…...

Whisper离线部署问题处理

Whisper是OpenAI开发一款开源语音识别模型&#xff0c;可以帮我们低成本的拥有语音识别的能力。具体的安装部署方法&#xff0c;我在这里就不详细说了&#xff0c;网上有很多相关文章&#xff1a; 使用OpenAI的Whisper 模型进行语音识别 (baidu.com) 我这里主要想说的是&…...

【Hive SQL】数据探查-数据抽样

文章目录 数据随机抽样1、随机数排序抽样&#xff08;rand()&#xff09;2、数据块抽样&#xff08;tablesample()&#xff09;3、分桶抽样 数据随机抽样 在大规模数据量的数据分析及建模任务中&#xff0c;往往针对全量数据进行挖掘分析时会十分耗时和占用集群资源&#xff0c…...

微信答题小程序产品研发-需求分析与原型设计

欲知应候何时节&#xff0c;六月初迎大暑风。 我前面说过&#xff0c;我决意仿一款答题小程序&#xff0c;所以我做了大量的调研。 题库软件产品开发不仅仅是写代码这一环&#xff0c;它包含从需求调研、分析与构思、设计到开发、测试再到部署上线一系列复杂过程。 需求分析…...

基础模板Mybatis-plus+Springboot+Mysql开发配置文件

1.pom.xml <dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency>// mybatisplus功能<dependency&g…...

java-poi实现excel自定义注解生成数据并导出

因为项目很多地方需要使用导出数据excel的功能&#xff0c;所以开发了一个简易的统一生成导出方法。 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version…...

LeetCode707 设计链表

前言 题目&#xff1a; 707. 设计链表 文档&#xff1a; 代码随想录——设计链表 编程语言&#xff1a; C 解题状态&#xff1a; 代码功底不够&#xff0c;只能写个大概 思路 主要考察对链表结构的熟悉程度&#xff0c;对链表的增删改查&#xff0c;比较考验代码功底以及对链表…...

[Mysql-DDL数据操作语句]

目录 DDL语句操作数据库 库&#xff1a; 查看&#xff1a;show 创建&#xff1a;creat 删除&#xff1a;drop 使用(切换)&#xff1a;use 表&#xff1a; 查看&#xff1a;desc show 创建&#xff1a;create 表结构修改 rename as add drop modify change rename as …...

google 浏览器插件开发简单学习案例:TodoList;打包成crx离线包

参考&#xff1a; google插件支持&#xff1a; https://blog.csdn.net/weixin_42357472/article/details/140412993 这里是把前面做的TodoList做成google插件&#xff0c;具体网页可以参考下面链接 TodoList网页&#xff1a; https://blog.csdn.net/weixin_42357472/article/de…...

如何学习Doris:糙快猛的大数据之路(从入门到专家)

引言:大数据世界的新玩家 还记得我第一次听说"Doris"这个名字时的情景吗?那是在一个炎热的夏日午后,我正在办公室里为接下来的大数据项目发愁。作为一个刚刚跨行到大数据领域的新手,我感觉自己就像是被丢进了深海的小鱼—周围全是陌生的概念和技术。 就在这时,我的…...

梯度下降算法,gradient descent algorithm

定义&#xff1a;是一个优化算法&#xff0c;也成最速下降算法&#xff0c;主要的部的士通过迭代找到目标函数的最小值&#xff0c;或者收敛到最小值。 说人话就是求一个函数的极值点&#xff0c;极大值或者极小值 算法过程中有几个超参数&#xff1a; 学习率n&#xff0c;又称…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...