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

spring-web搭建

先说说这篇文章看完你能学习到什么吧

1:spring-web是什么原理以及组成,2:spring-web的搭建(以普通tomcat服务器做基础),3:敲黑板
1:spring-web是什么原理以及组成

spring-web是spring中提供给用户搭建web服务的框架,其中的spring-webmvc是其核心部分,webmvc采用MVC架构,M是model层,V是view层,C是controller层。那我们从这三个层次去讲解这部分。首先我们用一整套访问请求来讲解原理:

1->用户请求到服务器。

用户作为使用者,是用游览器(客户端)输入网址通过域名解析访问到我们的域名主机,然后域名主机会找到相应对的发布的服务(java服务,php服务)等,我们是java服务器,部署在tomcat上,那么tomcat就会根据程序上下文(application context)或者说它里面的Server.xml找到Host节点里面的Context节点找到项目的发布目录。

2->spring web的映射请求地址到相应的controller(C)。

tomcat调用java服务的Servlet,java第一道防线就是DispatcherServlet(中央调度器)。DispatcherServlet请求handlerMapping,返回相应的执行器handler,DispatcherServlet通过HandlerAdapter调用相应的handler执行器。执行器handler根据url找到相应的处理器调用controller

3->controller(c)进行数据处理,返回数据modelAndView(M)给DispatcherServlet。

controller接下来会进行数据处理,比如调用service去保存或者查询数据,service去通过dao进行持久化数据,然后返回数据给controller,controller把数据和需要返回的url给DispatcherServlet(也就是返回modelAndView对象)

4->ViewResolve进行视图解析返回view(V)

DispatcherServlet拿到modelAndView去找ViewResolver解析视图,返回view给DispatcherServlet。

5->DispatcherServlet响应数据,视图渲染

DispatcherServlet拿到view数据,返回给tomcat,tomcat相应游览器请求,并让其渲染视图。

这就是一整套请求和渲染流程,采用mvc架构

2:spring-web的搭建(以普通tomcat服务器做基础)
1->环境(自己去建一个普通web项目)
【jdk8】,【spring-web5.2.3】,【spring-webmvc5.2.3】,【intellj idea2018】
2->WEB-INF的web.xml配置(程序入口)

a:配置DispatcherServlet(中央调度器)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><!-- 这里有的地方叫dispatcher-servlet.xml,都一样-->   <param-value>/WEB-INF/spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

b:spring-mvc.xml配置HandlerMapping和HandlerAdapter和ViewResolver和Controller以及bean的扫描路径,这里多配置了个访问拦截器。各位可以针对访问权限进行拦截

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"default-lazy-init="true"><!--mvc注解配置,方便我们使用@Autowired等注解--><context:annotation-config /><!--自动注册注解驱动 包扣handlerMapping和handlerAdapter的注册--><mvc:annotation-driven /><!--使Spring支持自动检测组件,如注解的Controller,这个注解包含了上面annotation-config--><context:component-scan base-package="com.wanzi.controller" /><context:property-placeholder location="WEB-INF/config.properties"/><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".jsp" /><!-- spring3.1之前用的是DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter,可以自动扫描bean上面有@Controller--><!--<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />--><!--&lt;!&ndash; 启动 Spring MVC 的注解功能,完成请求和注解 POJO 的映射 &ndash;&gt;--><!--<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">--><!--<property name="messageConverters">--><!--<list>--><!--<bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean>--><!--</list>--><!--</property>--><!--</bean>--><!-- spring3.1之后用的是RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可以自动扫描bean上面有@Controller--><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /><!-- 启动 Spring MVC 的注解功能,完成请求和注解 POJO 的映射 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean></list></property></bean><!-- 异常处理handler --><bean id="exceptionHandler" class="com.wanzi.handler.ExceptionHandler" /><!-- 文件上传设置 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize"><value>104857600</value></property></bean><!--静态资源--><mvc:resources mapping="/script/plugins/**" location="/script/plugins/"/><!-- 拦截器配置 --><mvc:interceptors><!-- 系统端校验 --><mvc:interceptor><mvc:mapping path="/**" /><bean id="sysAuthInterceptor" class="com.wanzi.interceptor.SysAuthInterceptor"></bean></mvc:interceptor></mvc:interceptors>
</beans>

c:配置程序上下文

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

 d:applicationContext.xml配置数据库连接池和持久层框架以及事务

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.wanzi" /><context:property-placeholder location="/WEB-INF/config.properties"/><bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="${mysql_url}"/><property name="username" value="${mysql_username}"/><property name="password" value="${mysql_password}"/><property name="validationQuery" value="select database()"/></bean><!-- 配置数据库,这里选用hibernate框架连接,这个包再orm的hibernate中--><bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="hibernateProperties"><props><prop key="hibernate.show_sql">true</prop><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><!--千万别配置这个,这个属性不生效<prop key="hbm2ddl.auto">create</prop>--><!--这里自动更新和创建表--><prop key="hibernate.hbm2ddl.auto">update</prop></props></property><property name="packagesToScan" value="com.wanzi.entity"/></bean><!-- 这里注入hibernateTemplate,给传统的dao作为参数使用,可以使用@Repository中@Autowired注入--><bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"><property name="sessionFactory" ref="sessionFactory"></property></bean><bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"/></bean><tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

e:config.properties的数据

mysql_url=jdbc:mysql://127.0.0.1:3306/spring-web?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&tinyInt1isBit=false&useOldAliasMetadataBehavior=true
mysql_username=root
mysql_password=
 3->commons-loggings配置(这个log4j.properties必须放在classes下,也就是src那一层)
log4j.rootLogger=info,A#系统输出
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.Target=System.out
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t:%p] %c %m%n
4->写个controller(C)
package com.wanzi.controller.sys;import com.wanzi.annotation.UnAuth;
import com.wanzi.entity.SysAdmin;
import com.wanzi.service.SysAdminService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@UnAuth
@Slf4j
@RequestMapping("/sys/test")
public class TestController {@Autowiredprivate SysAdminService sysAdminService;@RequestMapping(value = "/test")@ResponseBodypublic Object test(){log.error("权限检验通过");return "test";}@RequestMapping(value = "/index")public String index(Model model){log.error("权限检验通过");SysAdmin sysAdmin = sysAdminService.getSysAdminById(1);model.addAttribute("test","我是测试传参");return "/sys/test/index";}
}
5->写个Model(M),上文的sysAdminService
a:service
package com.wanzi.service;import com.wanzi.dao.SysAdminDao;
import com.wanzi.entity.SysAdmin;
import com.wanzi.template.SimpleHibernateTemplate;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;/*** 系统管理员service*/
@Service
@Transactional
public class SysAdminService {@Autowiredprivate SysAdminDao sysAdminDao;private SimpleHibernateTemplate<SysAdmin, Integer> sysAdminDaoH;@Autowiredpublic void setSessionFactory (SessionFactory sessionFactory) {sysAdminDaoH = new SimpleHibernateTemplate<>(sessionFactory, SysAdmin.class);}/*** 根据id获取系统管理员信息* * @param id*            void*/public SysAdmin getSysAdminById (int id) {return sysAdminDao.getSysAdminById(id);
//    return this.sysAdminDaoH.get(id);}}
b:dao

这里dao我用了两种方法,一种是用系统HibernateTemplate实现增删改查,一种是用Session实现增删改查。

b->1:HibernateTemplate方式

上面的applicationContext.xml中有配置名字为hibernateTemplate的bean,传统方式就是操作这个类实现增删改查,下面是一个例子Dao

package com.wanzi.dao;import com.wanzi.entity.SysAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;@Repository
public class SysAdminDao {@Autowiredprivate HibernateTemplate hibernateTemplate;public SysAdmin getSysAdminById (int id) {return hibernateTemplate.get(SysAdmin.class,id);}}

 b->2:灵活的Session

上文中service操作的SimpleHibernateTemplate是自定义的dao

package com.wanzi.template;import java.io.Serializable;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**
R* Hibernate的范型基类.* * 可以在service类中直接创建使用.也可以继承出DAO子类,在多个Service类中共享DAO操作.* 参考Spring2.5自带的Petlinc例子,取消了HibernateTemplate.* 通过Hibernate的sessionFactory.getCurrentSession()获得session,直接使用Hibernate原生API.** @param <T> DAO操作的对象类型* @param <PK> 主键类型*/
public class SimpleHibernateTemplate<T, PK extends Serializable> {protected SessionFactory sessionFactory;protected Class<T> entityClass;public SimpleHibernateTemplate(SessionFactory sessionFactory, Class<T> entityClass) {this.sessionFactory = sessionFactory;this.entityClass = entityClass;}/*** 采用@Autowired按类型注入SessionFactory,当有多个SesionFactory的时候Override本函数.* 这个注解会生效*/@Autowiredpublic void setSessionFactory(final SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}public Session getSession() {return sessionFactory.getCurrentSession();}/*** 按id获取对象.*/public T get(final PK id) {return (T) getSession().get(entityClass, id);}
}
c:entity(这里不需要写建表语句,通过spring hibernate的hibernate.hbm2ddl.auto自动更新维护表)

 

package com.wanzi.entity;import lombok.Data;import java.util.Date;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;/*** table : sys_admin # 系统管理员数据表* * @author zwm*/
@Data
@Table(name = "sys_admin")
@Entity
public class SysAdmin {/*** 管理员状态:0、停用*/public static final int STATUS_DISABLE = 0;/*** 管理员状态:1、启用*/public static final int STATUS_ENABLE = 1;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private int id;@Column(name = "name")private String name;@Column(name = "password")private String password;@Column(name = "md5_password")private String md5Password;/*** 使用者*/@Column(name = "real_name")private String realName;@Column(name = "status")private int status;@Column(name = "phone_num")private String phoneNum;@Column(name = "remark")private String remark;@Column(name = "last_login_time")private Date lastLoginTime;@Column(name = "last_login_ip")private String lastLoginIp;}

d:扩展知识

d->1:和数据库mysql相连,java采用线程池,现如今java有很多好用线程池,本例子采用dbcp2

,在applicationContext.xml中有配置dataSource,其他的数据源还有:

Apache Commons DBCP:Apache Commons DBCP(数据库连接池)是Apache软件基金会的一个项目,提供了一个稳定和可靠的连接池。它是许多Java应用程序的首选选择。

HikariCP:HikariCP是一个轻量级、高性能的数据库连接池,被广泛认为是目前性能最好的连接池之一。它专注于快速的连接获取和释放,适用于高并发的应用程序。

C3P0:C3P0是一个开源的数据库连接池,具有许多配置选项,可用于调整连接池的行为。它是一种稳定的连接池,被许多Java应用程序使用。

Tomcat JDBC Pool:Tomcat JDBC Pool是Apache Tomcat项目的一部分,提供了一个性能良好的连接池。它设计用于与Tomcat集成,但也可以作为独立的连接池使用。

H2 Database:H2 Database是一个嵌入式数据库,它包含了一个内置的连接池,适用于小型应用程序和测试用例。

Druid:Druid是一个开源的数据库连接池,具有监控和统计功能,可以帮助开发人员分析数据库连接的使用情况和性能。Bitronix Transaction Manager:Bitronix是一个支持分布式事务的连接池和事务管理器,适用于需要强大事务支持的应用程序。

二、当讨论连接词(连接池)时,可以通过生活中的一个例子来形象地理解它们的区别:
例子:自来水供应

Apache Commons DBCP 可以类比为一个城市自来水公司,它负责向一座城市供水。这个水公司(连接池)管理着水的分配和流动,确保城市里的每户家庭都可以获得他们所需的水(数据库连接)。虽然它提供了稳定和可靠的供水服务,但它的运作可能不一定是最高效的,因为它可能需要一些时间来响应不同地区的需求。

HikariCP 就像是一家高效的自来水公司,它专注于提供最快速的自来水供应。它的供水管道(连接池)设计得非常流畅,可以迅速响应城市中不同区域的需求,确保每家每户都能够获得所需的水。这家自来水公司以其高性能和响应速度而著称。

C3P0 可以比作另一家自来水公司,它提供了许多不同的自来水供应计划,可以根据客户的需求进行定制。这家公司提供了灵活的供水方案,允许客户根据他们的特定需求来调整水的流量和质量。

Tomcat JDBC Pool 好像是一个城市自来水部门的子部门,专门为城市的一座公共建筑提供自来水服务。虽然它与整个城市的自来水系统相互关联,但它也可以独立运行,提供高效的供水服务。

H2 Database 就像是一个小村庄的自来水泵站,它供应水给村里的居民。虽然规模较小,但它是自足的,提供了足够的水供应来满足小村庄的需求。Druid 就像是一个有水质检测设备的自来水公司,它不仅提供水供应,还监控水的质量,并提供统计数据以帮助客户了解他们的水消耗情况。

d->2: 事务

@Transactional注解是Spring框架中用于声明式事务管理的关键注解,这个方法可以作用于类和方法,作用于类是整个类都开启该方法,作用于方法的话,该方法会被归纳到事务管理,事务管理有以下几个特性原子性,一致性,隔离性,持久性。原子性表示一个事务里所有操作要么全部成功,要么全部失败,因为最后都是事务管理统一提交的。一致性表示事务提交前后数据库状态一致。隔离性表示多个事务提交是并行,互不影响。持久性表示事务一旦提交修改数据会永久保存。那么对于事务用户有哪些要注意的呢,第一事务不能作用于非public的方法,第二事务注解@Transactional不能被作用于多个方法调用,也就是外部没有这个注解,调用有这个注解的方法,那么事务是无法开启,第三方法开启了事务,但是你自己捕捉了异常,那么事务就不会被异常回滚.
6->写个拦截器 (这个拦截器会优先拦截所有请求,只有return true才会允许给相应controller处理)
package com.wanzi.interceptor;import java.lang.reflect.Method;import com.wanzi.annotation.MenuAuth;
import com.wanzi.annotation.UnAuth;
import com.wanzi.bean.SysLoginAdmin;
import com.wanzi.entity.SysAdmin;
import com.wanzi.service.SysAdminService;
import com.wanzi.util.WebUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 系统端权限登录校验*/
@Slf4j
public class SysAuthInterceptor extends HandlerInterceptorAdapter {@Autowiredprivate SysAdminService adminService;/*** This implementation always returns {@code true}.*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {MenuAuth menuAuth = null;log.error("后端权限开始判断");HandlerMethod handlerMethod = (HandlerMethod) handler;Class clasz = handlerMethod.getBean().getClass();//不需要检验授权的可以跳过if (clasz.isAnnotationPresent(UnAuth.class)) {return true;}//通过匹配找到url匹配的需要检验的方法注解MenuAuthMethod[] methods = clasz.getMethods();for (Method method : methods) {if (method.isAnnotationPresent(RequestMapping.class)) {if (method.isAnnotationPresent(UnAuth.class)) {RequestMapping mapping = method.getAnnotation(RequestMapping.class);for (String str : mapping.path()) {if (request.getRequestURI().indexOf(str) != -1) {return true;}}} else if (method.isAnnotationPresent(MenuAuth.class)) { // 菜单校验获取菜单RequestMapping mapping = method.getAnnotation(RequestMapping.class);for (String str : mapping.path()) {if (request.getRequestURI().indexOf(str) != -1) {menuAuth = method.getAnnotation(MenuAuth.class);break;}}if (menuAuth == null) {for (String str : mapping.value()) {if (request.getRequestURI().indexOf(str) != -1) {menuAuth = method.getAnnotation(MenuAuth.class);break;}}}if (menuAuth != null) {break;}}}}log.error("进入权限判断");SysLoginAdmin loginAdmin = WebUtils.getSysLoginAdmin();if (loginAdmin != null) {SysAdmin sysAdmin = adminService.getSysAdminById(loginAdmin.getId());if (sysAdmin != null) {if (sysAdmin.getStatus() == SysAdmin.STATUS_DISABLE) {throw new Exception("账号已停用,请联系管理员");}if (menuAuth != null&& !loginAdmin.checkMenuAuth(request.getRequestURI(), menuAuth)) {throw new Exception("无访问权限");}return true;}throw new Exception("账号不存在,请重新登录");}throw new Exception("账号未登录,请重新登录");}
}
7->写个异常处理器
package com.wanzi.handler;import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;/*** 异常处理*/
@Slf4j
public class ExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) {try {Map<String, Object> model = new HashMap<String, Object>();model.put("exception", ex);model.put("uri", request.getRequestURI());// ajax处理数据if (isAjaxRequest(request)) {return null;}// 其他处理跳转统一异常页面if(request.getRequestURI().startsWith("/m")){return new ModelAndView("exception/error_mobile", model);}return new ModelAndView("exception/error", model);} catch (Exception e) {log.error(e.getMessage(),e);}return null;}/*** 是否ajax请求*/public static boolean isAjaxRequest(HttpServletRequest request) {return request.getHeader("x-requested-with") != null&& request.getHeader("x-requested-with").trim().toLowerCase().equals("xmlhttprequest");}}
3:敲黑板 

相关文章:

spring-web搭建

先说说这篇文章看完你能学习到什么吧 1&#xff1a;spring-web是什么原理以及组成&#xff0c;2&#xff1a;spring-web的搭建&#xff08;以普通tomcat服务器做基础&#xff09;&#xff0c;3&#xff1a;敲黑板 1&#xff1a;spring-web是什么原理以及组成 spring-web是sp…...

C++ 之LeetCode刷题记录(二十三)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 118. 杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows …...

在ubuntu上在安装Squid代理服务器

Squid 是一个代理和缓存服务器&#xff0c;它将请求转发到所需的目的地&#xff0c;同时保存请求的内容&#xff0c;当你再次请求相同内容时&#xff0c;他可以向你提供缓冲内容&#xff0c;从而提高访问速度。Squid代理服务器目前支持的协议有&#xff1a;http、SSL、DNS、FTP…...

如何解决 MySQL 的 socket 错误

MySQL 通过使用 socket 文件 来管理与数据库服务器的连接&#xff0c;这是一种特殊类型的文件&#xff0c;用于促进不同进程之间的通信。MySQL 服务器的 socket 文件名为 mysqld.sock&#xff0c;在 Ubuntu 系统中通常存储在 /var/run/mysqld/ 目录中。这个文件会被 MySQL 服务…...

5G智慧钢铁厂数字孪生三维可视化,推进钢铁新型工业化数字化转型

5G智慧钢铁厂数字孪生三维可视化&#xff0c;推进钢铁新型工业化数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为钢铁企业转型升级的必经之路。而5G技术的广泛应用&#xff0c;为钢铁企业数字化转型提供了新的机遇。其中&#xff0c;5G智慧钢铁厂数字孪生三维可…...

万户 ezOFFICE DocumentEditExcel.jsp SQL注入漏洞

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…...

OpenCV 2 - 矩阵的掩膜操作

1知识点 1-1 CV_Assert(myImage.depth() == CV_8U); 确保输入图像是无符号字符类型,若该函数括号内的表达式为false,则会抛出一个错误。 1-2 Mat.ptr(int i = 0); 获取像素矩阵的指针,索引 i 表示第几行,从0开始计行数。 1-3 const uchar* current = mylmage.ptr(row); 获得…...

linux -- 内存管理 -- 页面分配器

linux内存管理 为什么要了解linux内存管理 分配并使用内存&#xff0c;是内核程序与驱动程序中非常重要的一环。内存分配函数都依赖于内核中一个非常复杂而重要的组件 - 内存管理。 linux驱动程序不可避免要与内核中的内存管理模块打交道。 linux内存管理可以总体上分为两大…...

StarRocks-3.1.0 单节点部署

1. 相关环境准备 FE&#xff1a; /opt/starrocks BE&#xff1a; /opt/starrocks 安装包下载 wget https://releases.starrocks.io/starrocks/StarRocks-3.1.0.tar.gz解压缩 tar -zxvf StarRocks-3.1.0.tar.gz 安装jdk (v2.5 及以上版本建议安装 JDK 11&#xff0c;我们使用…...

2023美赛A题之Lotka-Volterra【完整思路+代码】

这是2023年的成功&#xff0c;考虑到曾经付费用户的负责&#xff0c;2024年可以发出来了。去年我辅导队伍数量&#xff1a;15&#xff0c;获奖M为主&#xff0c;个别F&#xff0c;H&#xff0c;零S。言归正传&#xff0c;这里我开始分享去年的方案。由于时间久远&#xff0c;我…...

关于如何将Win幻兽帕鲁服务端存档转化为单人本地存档的一种方法(无损转移)

本文转自博主的个人博客&#xff1a;https://blog.zhumengmeng.work,欢迎大家前往查看。 原文链接&#xff1a;点我访问 **起因&#xff1a;**最近大火的开放世界缝合体游戏幻兽帕鲁的大火也是引起了博主的注意&#xff0c;然后博主和周边小伙伴纷纷入手&#xff0c;博主也是利…...

计算机网络——IP协议

前言 网络层的主要负责地址分配和路由选择,ip负责在网络中进行数据包的路由和传输。 IPv4报文组成&#xff08;了解&#xff09; IPv4首部&#xff1a;IPv4首部包含了用于路由和传输数据的控制信息&#xff0c;其长度为20个字节&#xff08;固定长度&#xff09;。 版本&#…...

Linux命令-ar命令(建立或修改备存文件,或是从备存文件中抽取文件)

补充说明 ar命令 是一个建立或修改备存文件&#xff0c;或是从备存文件中抽取文件的工具&#xff0c;ar可让您集合许多文件&#xff0c;成 为单一的备存文件。在备存文件中&#xff0c;所有成员文件皆保有原来的属性与权限. 语法 ar [-]{dmpqrtx}[abcfilNoPsSuvV] [memberna…...

flask基于python的个人理财备忘录记账提醒系统vue

在当今高度发达的信息中&#xff0c;信息管理改革已成为一种更加广泛和全面的趋势。 “备忘记账系统”是基于Mysql数据库&#xff0c;在python程序设计的基础上实现的。为确保中国经济的持续发展&#xff0c;信息时代日益更新&#xff0c;蓬勃发展。同时&#xff0c;随着信息社…...

【leetcode题解C++】257.二叉树的所有路径 and 404.左叶子之和 and 112.路径总和

257. 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5",&…...

Linux——文本编辑器Vim

Linux中的所有内容以文件形式管理&#xff0c;在命令行下更改文件内容&#xff0c;常常会用到文本编辑器。我们首选的文本编辑器是Vim&#xff0c;它是一个基于文本界面的编辑工具&#xff0c;使用简单且功能强大&#xff0c;更重要的是&#xff0c;Vim是所有Linux发行版本的默…...

以“美”为鉴,探寻香港比特币现货ETF的未来发展

出品&#xff5c;欧科云链研究院 作者&#xff5c;Hedy Bi 根据The Block于1月29日的报道&#xff0c;嘉实国际成为了首家向香港证监会提交比特币现货ETF申请的机构。早在去年12月22日&#xff0c;香港证监会发布了《有关证监会认可基金投资虚拟资产的通函》&#xff0c;明确…...

Unity项目打包的方法(之一)

在 Unity 中&#xff0c;将项目打包成 .unitypackage 文件和直接压缩 Assets、Packages 和 ProjectSettings 目录有几个关键区别&#xff0c;主要体现在打包方式、使用目的和包含的内容上。 打包成 UnityPackage .unitypackage 是 Unity 的一种打包格式&#xff0c;它允许你将项…...

如何安装MySQL

如何安装MySQL 前提条件下载MySQL在 Windows 上安装 MySQL验证 MySQL 安装 MySQL是当今工业界广泛使用的最流行的关系数据库管理软件之一。它通过各种存储引擎提供多用户访问支持。它得到了甲骨文公司的支持。在本节中&#xff0c;我们将学习如何为初学者下载和安装 MySQL。 前…...

如何编写.gitignore文件

文章目录 前端架构师教你如何编写.gitignore文件.gitignore文件简介.gitignore文件的语法规则.gitignore文件的最佳实践常见问题与解决 前端架构师教你如何编写.gitignore文件 .gitignore文件简介 .gitignore文件是Git版本控制系统中一个非常有用的工具。它可以指定一组文件或…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Redis数据倾斜问题解决

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

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...