MVC模式分层练习

新建库

新建表

插入点数据

先不用MVC模式写功能,来看下缺点是什么

新建一个空项目

选项项目使用的JDK

自己的IDEA总是要重启下

新建模块

因maven还没教

添加框架支持

添加后项目多了这些

添加些必要依赖  这里注意下,如果导入jar包不对可以重新导入下或者是jar包本身出了问题

添加页面

配置Tomcat

启动

请求地址  因现在没有后端

现在写后端 并测试

解决控制台输出乱码问题

System.out输出乱码

需要用到JDBC连接Mysql数据库

导入Mysql驱动jar包

java web项目  一般会在WEB-INF下有个lib用来放Tomcat内没有,外部引入的依赖

可以创建个lib目录  然后将jar包复制进来

具体代码

package com.bank.web;import com.bank.exception.AppException;
import com.bank.exception.MoneyNotEnoughException;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.*;
import java.sql.*;
import java.util.Locale;/*** 在不使用MVC架构模式的前提下,完成银行账户转账* 分析这个程序存在哪些问题?* @author hrui* @date 2023/8/31 23:06*/
@WebServlet("/transfer")
public class AccountTransferServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取响应流对象resp.setContentType("text/html;charset=UTF-8");PrintWriter writer = resp.getWriter();//获取前端传来的参数String fromActno = req.getParameter("fromActno");String toActno = req.getParameter("toActno");double money = Double.parseDouble(req.getParameter("money"));
//        System.out.println("转出账户:"+fromActno);
//        System.out.println("转入账户:"+fromActno);
//        System.out.println("转账金额:"+fromActno);//编写转账的业务逻辑代码,连接数据库,进行转账操作//1.转账之前要判断转出账户的余额是否充足Connection conn=null;PreparedStatement ps=null;//PreparedStatement ps2=null;ResultSet rs=null;try {//注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//获取连接conn = DriverManager.getConnection("xxx", "xxx", "xxx");conn.setAutoCommit(false);//获取执行对象String sql="select balance from t_act where actno=?";ps = conn.prepareStatement(sql);ps.setString(1, fromActno);//执行sql,返回结果集rs = ps.executeQuery();//获取结果集if(rs.next()){double balance = rs.getDouble("balance");if(balance<money){//余额不足(使用异常处理机制)throw new MoneyNotEnoughException("余额不足");}//程序能到这里,说明余额重组  不需要else//开始转账sql="update t_act set balance=balance-? where actno=?";ps = conn.prepareStatement(sql);ps.setDouble(1, money);ps.setString(2, fromActno);int count = ps.executeUpdate();//模拟异常String str=null;str.toString();sql="update t_act set balance=balance+? where actno=?";ps=conn.prepareStatement(sql);ps.setDouble(1, money);ps.setString(2, toActno);//累计count += ps.executeUpdate();if(count!=2){throw new AppException("app异常,请联系管理员");}}conn.commit();writer.print("转账成功");} catch (ClassNotFoundException | SQLException | MoneyNotEnoughException | AppException e) {try {if(conn!=null) {conn.rollback();}} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();writer.print(e.getMessage());}finally {//释放资源,根据JDBC规范 从小到大if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(ps!=null){try {ps.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}

1>负责了数据接收

2>负责了核心业务处理

3>负责了数据库表中的CRUD操作(Create(增) Retrieve(查) Update(改) Delete(删))

4>负责了数据的页面展示

引起的缺点:

代码复用性差  比如查余额,可以抽取出来,单独放到一个方法

代码复用性差的原因,没有职能分工,独立组件的概念,代码之间耦合度高,扩展力差

操作数据库代码和业务逻辑混杂在一起,容易出错,无法专注于业务逻辑书写

下面以MVC的模式对上面代码改进

1.系统为什么要分层?

        希望专人干专事.各司其职.分工明确.这样可以降低耦合,扩展增强.复用增强

2.软件架构中,有一个非常著名的架构模式:MVC模式

M(Model:数据/业务)       V(View:视图/展示)       C(Controller:控制器/核心)

首先是对JDBC的封装

JDBC工具类

package com.bank.utils;import java.sql.*;
import java.util.ResourceBundle;/*** @author hrui* @date 2023/9/1 10:24*/
public class DBUtil {private static ResourceBundle bundle=ResourceBundle.getBundle("resources/jdbc");private static String driver=bundle.getString("driver");private static String url=bundle.getString("url");private static String username=bundle.getString("username");private static String password=bundle.getString("password");//不让创建对象,原因工具类方法一般都静态的,无需外部创建对象//为防止外部创建对象,构造私有化private DBUtil(){}//DBUtil类加载时注册驱动static{try {Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();}}//没有使用连接池,直接创建的连接对象public static Connection getConnection() throws SQLException {Connection conn= DriverManager.getConnection(url,username,password);return conn;}public static void close(Connection conn, Statement statement, ResultSet rs){if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}

测试连接

封装实体类

package com.bank.mvc;import java.util.Objects;/*** 账户实体类,用于封装账户信息* POJO对象* 有的人也会把这种专门封装数据的对象,称为bean对象(javabean:咖啡豆)* 有的人也会把这种专门分装数据的对象,称为领域模型对象.domain对象.* pojo,bean,domain* @author hrui* @date 2023/9/1 15:34*/
public class Account {private Long id;private String actno;private Double balance;public Account() {}public Account(Long id, String actno, Double balance) {this.id = id;this.actno = actno;this.balance = balance;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getActno() {return actno;}public void setActno(String actno) {this.actno = actno;}public Double getBalance() {return balance;}public void setBalance(Double balance) {this.balance = balance;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Account acount = (Account) o;return id.equals(acount.id) && actno.equals(acount.actno) && balance.equals(acount.balance);}@Overridepublic int hashCode() {return Objects.hash(id, actno, balance);}@Overridepublic String toString() {return "Account{" +"id=" + id +", actno='" + actno + '\'' +", balance=" + balance +'}';}
}

编写DAO层

package com.bank.mvc;import com.bank.utils.DBUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;/*** 负责Acount数据的增删改查* 1.什么是DAO*      Data Access Object(数据访问对象)* 2.DAO实际上是一种设计模式,属于JAVAEE的设计模式之一.(不是23种设计模式)* 3.DAO只负责数据库CRUD,没有任何业务逻辑* 4.没有任何业务逻辑,只负责表中数据增删改查,有一个特殊的称谓:DAO对象* @author hrui* @date 2023/9/1 12:39*/
public class AccountDao {public int insert(Account act){Connection conn=null;PreparedStatement ps=null;int count=0;try {conn= DBUtil.getConnection();String sql="insert into t_act(actno,balance) values (?,?)";ps=conn.prepareStatement(sql);ps.setString(1, act.getActno());ps.setDouble(2, act.getBalance());count=ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(conn,ps,null);}return count;}public int deleteByActno(Long id){Connection conn=null;PreparedStatement ps=null;int count=0;try {conn=DBUtil.getConnection();String sql="delete from t_act where id=?";ps=conn.prepareStatement(sql);ps.setLong(1, id);count = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(conn,ps,null);}return count;}public int update(Account act){Connection conn=null;PreparedStatement ps=null;int count=0;try {conn=DBUtil.getConnection();String sql="update t_act set balance=? where id=?";ps=conn.prepareStatement(sql);ps.setDouble(1, act.getBalance());ps.setLong(2, act.getId());count = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(conn,ps,null);}return count;}public Account selectBtActNo(String actno){Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;Account account=new Account();try {conn=DBUtil.getConnection();String sql="select id,actno,balance from t_act where actno=?";ps=conn.prepareStatement(sql);ps.setString(1, actno);rs = ps.executeQuery();if(rs.next()){Long id=rs.getLong("id");String actno1=rs.getString("actno");Double balance=rs.getDouble("balance");account.setId(id);account.setActno(actno1);account.setBalance(balance);}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(conn,ps,null);}return account;}public List<Account> selectAll(){Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;List<Account> list=new ArrayList<>();try {conn=DBUtil.getConnection();String sql="select id,actno,balance from t_act ";ps=conn.prepareStatement(sql);rs = ps.executeQuery();while(rs.next()){Long id=rs.getLong("id");String actno=rs.getString("actno");Double balance=rs.getDouble("balance");Account account=new Account();account.setId(id);account.setActno(actno);account.setBalance(balance);list.add(account);}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(conn,ps,null);}return list;}
}

原先在Servlet里

1>负责了数据接收

2>负责了狠心业务处理

3>负责了数据库表中数据CRUD操作

4>负责了页面数据展示

现在已经一层层分离了

两个异常类

用AccountSAervice来做业务处理

具体业务处理代码

package com.bank.mvc;import com.bank.exception.AppException;
import com.bank.exception.MoneyNotEnoughException;/*** Service:业务* 专门处理Account的业务处理类* 该类只专注业务处理* 主要专注于MVC模式,不需要专注于取什么名字  xxx都可以* @author hrui* @date 2023/9/2 0:49*/
public class AccountService {private AccountDao accountDao=new AccountDao();/*** 完成转账的业务逻辑* @param fromActno* @param toActno* @param money*/public void transfer(String fromActno,String toActno,double money) throws MoneyNotEnoughException, AppException {//查询余额是否充足Account fromAccount = accountDao.selectBtActNo(fromActno);if(fromAccount.getBalance()<money){throw new MoneyNotEnoughException("余额不足");}//程序到这里说明余额够Account toAct=accountDao.selectBtActNo(toActno);//修改余额fromAccount.setBalance(fromAccount.getBalance()-money);toAct.setBalance(toAct.getBalance()+money);//更新数据库int count=accountDao.update(fromAccount);count += accountDao.update(toAct);//count++;if(count!=2){throw new AppException("转账异常");}}}

servlet里做的就是调度

package com.bank.mvc;import com.bank.exception.AppException;
import com.bank.exception.MoneyNotEnoughException;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.io.PrintWriter;/*** 让AcountServlet做为Controller  调度员* 负责调度其他组件* @author hrui* @date 2023/9/1 12:27*/
@WebServlet("/transfer")
public class AccountServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取前端传来的参数String fromActno = req.getParameter("fromActno");String toActno = req.getParameter("toActno");double money = Double.parseDouble(req.getParameter("money"));//调用业务方法处理业务(调度Model处理业务)AccountService accountService=new AccountService();try {accountService.transfer(fromActno,toActno,money);resp.sendRedirect(req.getContextPath()+"/success.jsp");} catch (MoneyNotEnoughException e) {e.printStackTrace();resp.sendRedirect(req.getContextPath()+"/moneynoenough.jsp");} catch (AppException e) {e.printStackTrace();resp.sendRedirect(req.getContextPath()+"/error.jsp");}}
}

三个页面显示

 

上面代码缺少事务控制,一般事务都在service进行控制

一般来说是在service层去开启事务  提交事务

这里事务管理,做的low的方式就是在业务层获取数据库连接对象,然后传进去,当然这样做的话,在DAO层就不要在finally中关闭事务了.传个null就行,在Service中开启事务,并在Service中提交事务,在Service中的finally中关闭连接

上代码

DAO

package com.bank.mvc;import com.bank.utils.DBUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;/*** 负责Acount数据的增删改查* 1.什么是DAO*      Data Access Object(数据访问对象)* 2.DAO实际上是一种设计模式,属于JAVAEE的设计模式之一.(不是23种设计模式)* 3.DAO只负责数据库CRUD,没有任何业务逻辑* 4.没有任何业务逻辑,只负责表中数据增删改查,有一个特殊的称谓:DAO对象* @author hrui* @date 2023/9/1 12:39*/
public class AccountDao {public int insert(Account act,Connection conn){PreparedStatement ps=null;int count=0;try {String sql="insert into t_act(actno,balance) values (?,?)";ps=conn.prepareStatement(sql);ps.setString(1, act.getActno());ps.setDouble(2, act.getBalance());count=ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(null,ps,null);}return count;}public int deleteByActno(Long id,Connection conn){PreparedStatement ps=null;int count=0;try {String sql="delete from t_act where id=?";ps=conn.prepareStatement(sql);ps.setLong(1, id);count = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(null,ps,null);}return count;}public int update(Account act,Connection conn){PreparedStatement ps=null;int count=0;try {String sql="update t_act set balance=? where id=?";ps=conn.prepareStatement(sql);ps.setDouble(1, act.getBalance());ps.setLong(2, act.getId());count = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(null,ps,null);}return count;}public Account selectBtActNo(String actno,Connection conn){PreparedStatement ps=null;ResultSet rs=null;Account account=new Account();try {String sql="select id,actno,balance from t_act where actno=?";ps=conn.prepareStatement(sql);ps.setString(1, actno);rs = ps.executeQuery();if(rs.next()){Long id=rs.getLong("id");String actno1=rs.getString("actno");Double balance=rs.getDouble("balance");account.setId(id);account.setActno(actno1);account.setBalance(balance);}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(null,ps,null);}return account;}public List<Account> selectAll(Connection conn){Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;List<Account> list=new ArrayList<>();try {String sql="select id,actno,balance from t_act ";ps=conn.prepareStatement(sql);rs = ps.executeQuery();while(rs.next()){Long id=rs.getLong("id");String actno=rs.getString("actno");Double balance=rs.getDouble("balance");Account account=new Account();account.setId(id);account.setActno(actno);account.setBalance(balance);list.add(account);}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(null,ps,null);}return list;}
}

Service

package com.bank.mvc;import com.bank.exception.AppException;
import com.bank.exception.MoneyNotEnoughException;
import com.bank.utils.DBUtil;import java.sql.Connection;
import java.sql.SQLException;/*** Service:业务* 专门处理Account的业务处理类* 该类只专注业务处理* 主要专注于MVC模式,不需要专注于取什么名字  xxx都可以* @author hrui* @date 2023/9/2 0:49*/
public class AccountService {private AccountDao accountDao=new AccountDao();/*** 完成转账的业务逻辑* @param fromActno* @param toActno* @param money*/public void transfer(String fromActno,String toActno,double money) throws MoneyNotEnoughException, AppException {//Service层控制事务//开启事务(需要用到Connection对象)Connection conn=null;try {conn = DBUtil.getConnection();conn.setAutoCommit(false);//查询余额是否充足Account fromAccount = accountDao.selectBtActNo(fromActno,conn);if(fromAccount.getBalance()<money){throw new MoneyNotEnoughException("余额不足");}//程序到这里说明余额够Account toAct=accountDao.selectBtActNo(toActno,conn);//修改余额fromAccount.setBalance(fromAccount.getBalance()-money);toAct.setBalance(toAct.getBalance()+money);//更新数据库int count=accountDao.update(fromAccount,conn);count += accountDao.update(toAct,conn);
//        String str=null;
//        str.toString();//或者//count++;  会向用户提示转账失败  但是转账确已经完成   或者1账户减款而2账户没有加的情况if(count!=2){throw new AppException("转账异常");}conn.commit();} catch (SQLException e) {e.printStackTrace();}finally {DBUtil.close(conn,null,null);}}}

 

但上面代码有点low

如何解决Connection传参问题

用ThreadLocal

改造代码

DBUtil

package com.bank.utils;import java.sql.*;
import java.util.ResourceBundle;/*** @author hrui* @date 2023/9/1 10:24*/
public class DBUtil {private static ResourceBundle bundle=ResourceBundle.getBundle("resources/jdbc");private static String driver=bundle.getString("driver");private static String url=bundle.getString("url");private static String username=bundle.getString("username");private static String password=bundle.getString("password");//不让创建对象,原因工具类方法一般都静态的,无需外部创建对象//为防止外部创建对象,构造私有化private DBUtil(){}//DBUtil类加载时注册驱动static{try {Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();}}private static ThreadLocal<Connection> local=new ThreadLocal<>();//没有使用连接池,直接创建的连接对象public static Connection getConnection() throws SQLException {Connection conn=local.get();if(conn==null) {conn = DriverManager.getConnection(url, username, password);local.set(conn);}return conn;}public static void close(Connection conn, Statement statement, ResultSet rs){if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();//注意:关闭连接时候移除  Tomcat是支持线程池的,不从当前线程里移除 有可能下次别人拿到了,但是conn已经关闭local.remove();} catch (SQLException e) {e.printStackTrace();}}}
}

将AccountDao恢复原状,还是从DBUtil里取Connection,但是不需要再传参数,注意finally里面Connection照样传null,原因:还是需要在Service层进行事务控制

package com.bank.mvc;import com.bank.utils.DBUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;/*** 负责Acount数据的增删改查* 1.什么是DAO*      Data Access Object(数据访问对象)* 2.DAO实际上是一种设计模式,属于JAVAEE的设计模式之一.(不是23种设计模式)* 3.DAO只负责数据库CRUD,没有任何业务逻辑* 4.没有任何业务逻辑,只负责表中数据增删改查,有一个特殊的称谓:DAO对象* @author hrui* @date 2023/9/1 12:39*/
public class AccountDao {public int insert(Account act){PreparedStatement ps=null;int count=0;try {Connection  conn= DBUtil.getConnection();String sql="insert into t_act(actno,balance) values (?,?)";ps=conn.prepareStatement(sql);ps.setString(1, act.getActno());ps.setDouble(2, act.getBalance());count=ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(null,ps,null);}return count;}public int deleteByActno(Long id){PreparedStatement ps=null;int count=0;try {Connection  conn= DBUtil.getConnection();String sql="delete from t_act where id=?";ps=conn.prepareStatement(sql);ps.setLong(1, id);count = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(null,ps,null);}return count;}public int update(Account act){PreparedStatement ps=null;int count=0;try {Connection conn=DBUtil.getConnection();String sql="update t_act set balance=? where id=?";ps=conn.prepareStatement(sql);ps.setDouble(1, act.getBalance());ps.setLong(2, act.getId());count = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(null,ps,null);}return count;}public Account selectBtActNo(String actno){PreparedStatement ps=null;ResultSet rs=null;Account account=new Account();try {Connection conn=DBUtil.getConnection();String sql="select id,actno,balance from t_act where actno=?";ps=conn.prepareStatement(sql);ps.setString(1, actno);rs = ps.executeQuery();if(rs.next()){Long id=rs.getLong("id");String actno1=rs.getString("actno");Double balance=rs.getDouble("balance");account.setId(id);account.setActno(actno1);account.setBalance(balance);}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(null,ps,null);}return account;}public List<Account> selectAll(){PreparedStatement ps=null;ResultSet rs=null;List<Account> list=new ArrayList<>();try {Connection conn=DBUtil.getConnection();String sql="select id,actno,balance from t_act ";ps=conn.prepareStatement(sql);rs = ps.executeQuery();while(rs.next()){Long id=rs.getLong("id");String actno=rs.getString("actno");Double balance=rs.getDouble("balance");Account account=new Account();account.setId(id);account.setActno(actno);account.setBalance(balance);list.add(account);}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtil.close(null,ps,null);}return list;}
}

业务层

package com.bank.mvc;import com.bank.exception.AppException;
import com.bank.exception.MoneyNotEnoughException;
import com.bank.utils.DBUtil;import java.sql.Connection;
import java.sql.SQLException;/*** Service:业务* 专门处理Account的业务处理类* 该类只专注业务处理* 主要专注于MVC模式,不需要专注于取什么名字  xxx都可以* @author hrui* @date 2023/9/2 0:49*/
public class AccountService {private AccountDao accountDao=new AccountDao();/*** 完成转账的业务逻辑* @param fromActno* @param toActno* @param money*/public void transfer(String fromActno,String toActno,double money) throws MoneyNotEnoughException, AppException {try(Connection conn= DBUtil.getConnection()){conn.setAutoCommit(false);//查询余额是否充足Account fromAccount = accountDao.selectBtActNo(fromActno);if(fromAccount.getBalance()<money){throw new MoneyNotEnoughException("余额不足");}//程序到这里说明余额够Account toAct=accountDao.selectBtActNo(toActno);//修改余额fromAccount.setBalance(fromAccount.getBalance()-money);toAct.setBalance(toAct.getBalance()+money);//更新数据库int count=accountDao.update(fromAccount);count += accountDao.update(toAct);
//        String str=null;
//        str.toString();//或者//count++;  会向用户提示转账失败  但是转账确已经完成   或者1账户减款而2账户没有加的情况if(count!=2){throw new AppException("转账异常");}conn.commit();} catch (SQLException e) {e.printStackTrace();throw new AppException("转账异常");}}}

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

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

相关文章

C语言每日一练--------Day(8)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;图片整理 寻找数组下标 &#x1f493;博主csdn个人主页&#xff1a;小小…

安防监控/视频存储/视频汇聚平台EasyCVR接入海康Ehome车载设备出现收流超时的原因排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚平台既具…

C++ for 循环

for 循环允许您编写一个执行特定次数的循环的重复控制结构。 语法 C 中 for 循环的语法&#xff1a; for ( init; condition; increment ) {statement(s); }下面是 for 循环的控制流&#xff1a; init 会首先被执行&#xff0c;且只会执行一次。这一步允许您声明并初始化任…

1688API技术解析,实现关键词搜索淘宝商品(商品详情接口等)批量获取,可高并发

要使用1688API接口采集商品详情&#xff0c;可以按照以下步骤进行&#xff1a; 获取API接口权限&#xff1a;申请1688的app key和app secret&#xff0c;并获取access_token。 编写API请求代码&#xff1a;使用Python等编程语言&#xff0c;编写API请求代码。以下是一个Python…

ARM Cortex-M 的 SP

文章目录 1、栈2、栈操作3、Cortex-M中的栈4、MDK中的SP操作流程5、Micro-Lib的SP差别1. 使用 Micro-Lib2. 未使用 Micro-Lib 在嵌入式开发中&#xff0c;堆栈是一个很基础&#xff0c;同时也是非常重要的名词&#xff0c;堆栈可分为堆 (Heap) 和栈 (Stack) 。 栈(Stack): 一种…

【Maven】如何发现,定位,解决依赖冲突

发现冲突 运行的时候可能报出错误xx类找不到xx方法&#xff0c;xx类找不到&#xff0c;很有可能就是冲突导致的。 定位冲突根因 通过idea maven插件 idea安装插件&#xff0c;maven helper 比如我有两个依赖&#xff0c;guava和findbug。 他们都用到了jsr305&#xff0c;…

可观测性用观测云,观测云护航「杭州亚运会」

2023 年亚洲运动会定于 2023 年 9 月 23 日至 10 月 8 日在中国杭州举办&#xff0c;这是在党的二十大召开后&#xff0c;我国疫情防控措施优化调整后举办的最大规模、最高水平的国际综合性运动会&#xff0c;意义十分重大。杭州亚组委以「举办一届史上最成功的亚运会」为工作目…

14:00面试,14:08就出来了,问的问题有点变态

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

C++的多重继承

派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 等干脆取消了多继承。 …

Java后端开发面试题——集合篇

ArrayList底层的实现原理是什么 底层数据结构 ArrayList底层是用动态的数组实现的 初始容量 ArrayList初始容量为0&#xff0c;当第一次添加数据的时候才会初始化容量为10 扩容逻辑 ArrayList在进行扩容的时候是原来容量的1.5倍&#xff0c;每次扩容都需要拷贝数组 添加逻…

六、vim编辑器的使用

1、编辑器 (1)编辑器就是一款软件。 (2)作用就是用来编辑文件&#xff0c;譬如编辑文字、编写代码。 (3)Windows中常用的编辑器&#xff0c;有自带的有记事本(notepad)&#xff0c;比较好用的notepad、VSCode等。 (4)Linux中常用的编辑器&#xff0c;自带的最古老的vi&…

什么是Flex容器和Flex项目(Flex Container and Flex Item)?它们之间有什么关系?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Flex容器和Flex项目⭐ Flex容器⭐ Flex项目⭐ 关系⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为…

微服务--SkayWalking(链路追踪:国产开源框架)

SkayWalking&#xff1a;分布式系统的应用程序性能监视工具 作用&#xff1a;分布式追踪、性能指标分析、应用、服务依赖分析&#xff1b; SkayWalking性能剖析&#xff1a; 我操&#xff0c;能够定位到某一个方法会有多慢。。。 通过Tid查看全局所有的日志信息&#xff08…

springboot web开发整合Freemarker 模板引擎

目录 Freemarker添加依赖配置文件ymlcontrollerhtml Freemarker 简介&#xff1a; FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具…

Day5:react函数组件与类组件

「目标」: 持续输出&#xff01;每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。 「主要面向群体&#xff1a;」前端开发工程师&#xff08;初、中、高级&#xff09;、应届、转行、培训、自学等同学 Day4-今日话题 react「函数组件和类组件」的区别&…

javaScipt

javaScipt 一、JavaScript简介二、javaScript基础1、输入输出语法2、变量3、常量4、数据类型4.1、数字型 number4.2、字符串类型 string4.3、布尔类型 boolean4.4、未定义类型 undefined4.5、null 空类型4.6、typeof 检测变量数据类型 5、数据类型转换5.1、隐式转换5.2、显示转…

容器技术Linux Namespaces和Cgroups

对操作系统了解多少&#xff0c;仅仅敲个命令吗 操作系统虚拟化&#xff08;容器技术&#xff09;的发展历程 1979 年&#xff0c;UNIX 的第 7 个版本引入了 Chroot 特性。Chroot 现在被认为是第一个操作系统虚拟化&#xff08;Operating system level virtualization&#x…

QT基础教程之七Qt消息机制和事件

QT基础教程之七Qt消息机制和事件 事件 事件&#xff08;event&#xff09;是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘&#xff0c;或者是窗口需要重新绘制的时候&#xff0c;都会发出一个相应的事件。一些事件在对用户操作做出响应时发出&#xff0c…

【面经】字节测开实习岗面试题分享

1、自我介绍 2、为什么投了字节&#xff1f; 公司声誉&#xff1a;字节跳动是一家知名的科技公司&#xff0c;在互联网行业享有很高的声誉。 发展前景&#xff1a;字节跳动的业务涵盖了多个领域&#xff0c;包括短视频、资讯、教育等。这意味着您将有机会接触到不同的产品和…

C++通过JNI调用JAVA方法返回ArrayList对象

运行效果: JAVA实现: 获取系统已安装应用列表并返回List<String>对象 //使用系统API获取安装包列表public List<String> getAppList(MainActivity act) {List<String> packages = new ArrayList<String>();try {//取包信息列表List<PackageInf…