java28-SpringMVC

概述

Spring框架是分层的全栈式的轻量级开发框架,以IOC和AOP为核心,地址https://spring.io/

组成

  1. Data Access/Integration(数据访问/继承)
  • JDBC模块:提供一个JDBC抽象层,大幅度减少了在开发中对数据库操作的编码
  • ORM模块:对流行的对象关系映射API,包括JPA,JDO,Hibernate和iBatis提供集成层
  • OXM模块:提供一个支持对象XML映射的抽象层实现,如JAXB,Castor,XMLBeans,JiBX,和XStream
  • JMS模块:指JAVA消息服务,包含的功能为生产和消费的信息
  • Transaction事务模块:支持编程和声明式事务管理实现特殊接口类,并为所有的POJO
  1. web模块
  • WEB模块:提供了基本的web开发集成特性,例如文件上传,使用Servlet监听器的ioC容器初始化以及web应用上下文
  • Servlet模块:包括Spring模型-视图-控制器实现web应用程序
  • Struts模块:包括支持类的Spring应用程序,集成了经典的WEB-Servlet模块
  1. Core Container模块
  • Beans模块:提供了BeanFactory,是工厂模式的经典实现,Spring将管理对象称为Bean
  • Core模块:提供了Spring框架的基本组成部分,包括ioC和DI功能
  • Context上下文模块:建立在核心和Beans模块的基础之上,它是访问定义和配置任何对象的媒介ApplicationContext接口是上下文模块的焦点
  • Expression Language模块:是运行时查询和操作对象图的强大的表达式语言
  1. 其他模块
  • AOP模块:提供了面向切面编程实现,允许自定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性
  • Aspects模块:提供了与Aspectj的集成,是一个功能强大且成熟的面向切面编程框架
  • Instrumentation模块:提供了类工具支持和类加载器的实现,可以在特定的应用服务器中使用
  • Test模块:支持Spring模块,使用JUnit或TestNG测试框架

IOC概念

创建对象的权利,或者是控制位置,由JAVA代码转移到Spring容器,由Spring容器控制对象的创建,就是控制反转,Spring创建对象时,会读取配置文件中信息,然后使用反射给我们创建好的对象之后在容器中存储起来,当我们需要某个对象时,通过id获取对象即可,不需要我们自己去new


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    配置键名empDao,具体实现的类com.xpc.dao.impl.EmpDaoImpl--><bean id="empDao" class="com.xpc.dao.impl.EmpDaoImpl"></bean>
</beans>
// 测试
package com.xpc.test;import com.xpc.dao.EmpDao;
import com.xpc.dao.impl.EmpDaoImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class test1 {@Testpublic void testAddEmp(){EmpDaoImpl empDao = new EmpDaoImpl();empDao.addEmp();// 获取容器ApplicationContext a = new ClassPathXmlApplicationContext("spring.xml");EmpDao empDao1 = a.getBean("empDao", EmpDao.class);empDao1.addEmp();}
}

实现过程

  • XML解析技术读取配置文件
<bean id="empDao" class="com.xpc.dao.impl.EmpDaoImpl"></bean>
  • 反射技术获得实例化对象,放到容器中
  // 获取类的字节码Class<?> aClass = Class.forName("com.xpc.dao.impl.EmpDaoImpl");// 获得实例化对象Object o = aClass.newInstance();// 放入map中map.put("empDao",o);
  • 工厂模式Bean对象 getBean方法

javaBean

Bean管理就是spring对于JAVA程序中的对象的管理

  1. 对象的创建 IOC
    不用自己new对象,解决对象创建问题
  2. 属性的赋值
    DI 依赖的注入,创建属性时给对象的属性赋值,对象功能的实现往往要依赖于属性的值,那么给对象属性赋值就可以说成是依赖的注入
<?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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    <bean id="user1" class="com.xpc.bean.User" name="user" lazy-init="false"></bean>--><bean id="user" class="com.xpc.bean.User"><property name="userId" value="1"></property></bean><bean id="user"><constructor-arg name="userId" value="111"></constructor-arg></bean><bean id="user" class="com.xpc.bean.User" p:userName="111" p:userId="111"></bean>
</beans>
  1. 读取属性配置文件
<?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: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/contexthttp://www.springframework.org/schema/context/spring-context.xsd
">
<!--    读取jdbc.properties配置--><context:property-placeholder location="classpath:jdbc.properties"/><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" ><property name="username" value="${jdbc_username}"></property><property name="password" value="${jdbc_password}"></property><property name="url" value="${jdbc_url}"></property><property name="driverClassName" value="${jdbc_driverClassName}"></property></bean>
</beans>

bean生命周期

  1. 通过构造器创建bean实例 执行构造器
  2. 为bean属性赋值 执行set方法
  3. 初始化bean 调用bean的舒适化方法,需要配置指定调用的方法
  4. bean的获取 容器对象gebean方法
  5. 容器关闭销毁bean 调用销毁方法,需要配置指定调用的方法

bean后置处理器

可以在bean实例化,配置以及其他初始化方法前后要添加一些自己的逻辑处理可以定义一个或者多个BeanPostProcessor接口实现类

实现接口

package com.xpc.beanProcesser;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanProcesser implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// bean 得到的内存中的类// beanNameSystem.out.println("初始化之前");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("初始化之后");return bean;}
}

xml中配置

<bean id="beanProcesser" class="com.xpc.beanProcesser.MyBeanProcesser"></bean>

注解

注解创建对象

注解类型

注解作用
@Component放在类上,告诉Spring当前类需要由容器实例化bean并放入容器中,该注解有三个子注解
@Service用于实例化service层bean
@Controller用于实例化controller层bean
@Repository用于实例化持久层Bean
  • 现在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: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/contexthttp://www.springframework.org/schema/context/spring-context.xsd
"><context:component-scan base-package="com.xpc.bean"/>
</beans>
  • 需要实例化的类加上注解
package com.xpc.bean;import org.springframework.stereotype.Component;@Component
public class user {
}
  • 测试
package com.xpc.test;import com.xpc.bean.user;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test1 {@Testpublic void test(){ClassPathXmlApplicationContext ca = new ClassPathXmlApplicationContext("applicationContext.xml");user user = ca.getBean("user", user.class);System.out.println(user);}
}

注解方式依赖注入

  • 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: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/contexthttp://www.springframework.org/schema/context/spring-context.xsd
"><context:component-scan base-package="xpc"/>
</beans>
  • 加载类
package xpc.dao.impl;import org.springframework.stereotype.Repository;
import xpc.dao.UserDao;@Repository
public class ImplA implements UserDao {@Overridepublic void add() {System.out.println("add A");}
}package xpc.dao.impl;import org.springframework.stereotype.Repository;
import xpc.dao.UserDao;@Repository
public class ImplB implements UserDao {@Overridepublic void add() {System.out.println("add B");}
}
  • 配置依赖注入
package xpc.service.impl;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import xpc.dao.UserDao;
import xpc.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;@Service
public class UserImpl implements UserService {@Autowired@Qualifier(value = "implA")private UserDao userDao;@Overridepublic void add() {System.out.println("add UserImpl");userDao.add();}
}
  • 测试
 package com.xpc.test;import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import xpc.service.impl.UserImpl;public class Test1 {@Testpublic void test1(){ClassPathXmlApplicationContext ca = new ClassPathXmlApplicationContext("applicationContext2.xml");UserImpl userImpl = ca.getBean("userImpl", UserImpl.class);userImpl.add();// add UserImpl// add A}
}

@Autowired 根据类型到容器中找对应的对象,找到后给当前属性赋值 ,不依赖SET方法,配合@Qualifier可以指定名称注入对象
@Resource

  • 属性赋值
    • 静态赋值
package xpc.service.impl;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import xpc.dao.UserDao;
import xpc.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;@Service
public class UserImpl implements UserService {@Autowired@Qualifier(value = "implA")private UserDao userDao;@Value("静态赋值名字")public String name;@Overridepublic void add() {System.out.println("add UserImpl");userDao.add();}
}
-  动态赋值
#新建配置文件name.properties
sname=动态赋值
<!-- 读取配置文件-->
<?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: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/contexthttp://www.springframework.org/schema/context/spring-context.xsd
"><context:property-placeholder location="classpath:name.properties"/><context:component-scan base-package="xpc"/>
</beans>
package xpc.service.impl;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import xpc.dao.UserDao;
import xpc.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;@Service
public class UserImpl implements UserService {@Autowired@Qualifier(value = "implA")private UserDao userDao;@Value("${sname}")public String name;@Overridepublic void add() {System.out.println("add UserImpl");userDao.add();}
}

AOP 切面编程

AOP切面编程可以帮助我们在不修改现有代码的情况下,对程序的功能进行扩展,往往用于实现日志处理,权限控制,性能检测,事务控制等AOP实现的原理就是动态代理,再有接口的情况下,使用JDK动态代理,在没有接口情况下使用cglib动态代理

概念

  • 连接点
    可以被增加的方法叫做连接点
  • 切入点
    实际增强的方法叫切入点
  • 通知Advice
    实际增强的逻辑部分称为通知(增强的功能)
  • 目标对象(被增强功能的对象)
    织入Advice的目标对象
  • 切面Aspect
    表现为功能相关的一些advice方法放在一起声明组成一个Java类
  • 织入WEaving
    创建代理对象并实现功能增强的声明并运行过程

切入表达式

语法结构:execution([权限修饰符][返回值类型][类的全路劲方法][方法名][参数列表])

package com.xpc.aspect;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Aspect
@Component
public class DaoAspect {// 定义一个公共方法@Pointcut("execution(* com.xpc.dao.*.add*(..))")public void addPointCut(){}// 执行之前@Before("addPointCut()")public void methodBefore(){System.out.println("methodBefore");}// 执行之后@After("addPointCut()")public void methodAfter(){System.out.println("methodAfter");}// 方法返回值@AfterReturning(value = "addPointCut()",returning = "res")public void methodAfterReturning(JoinPoint joinPoint,Object res){// joinPoint 参数// res 返回值System.out.println(res);System.out.println("methodAfterReturning");}// 方法出异常执行@AfterThrowing(value = "addPointCut()",throwing = "exc")public void methodAfterThrowing(Exception exc){System.out.println(exc);}// 环绕通知 之前和之后都执行@Around("addPointCut()")public Object methodAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("around Before");// proceedingJoinPoint 表示切点,proceed表示执行切点方法,默认返回一个objectObject proceed = proceedingJoinPoint.proceed();System.out.println("around After");return proceed;}
}

spring事务

JdbcTemplate概述

JdbcTemplate是spring框架中提供的一个对象,用来对Jdbc AP进行简单封装

  • 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: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/contexthttp://www.springframework.org/schema/context/spring-context.xsd
"><context:property-placeholder location="classpath:jdbc.properties"/><context:component-scan base-package="com.xpc"/>
<!--    配置德鲁伊连接池--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="username" value="${jdbc_user}"/><property name="password" value="${jdbc_password}"/><property name="url" value="${jdbc_url}"/><property name="driverClassName" value="${jdbc_driver}"/></bean>
<!--    配置JDBCTemplate对象,并向里面注入DataSource--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean>
</beans>
  • 实现service层并关联dao层
  • 实现数据库存储对象
package com.xpc.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;@AllArgsConstructor
@NoArgsConstructor
@Data
public class Emp implements Serializable {private int EMPNO;private int DEPTNO;private String ENAME;private String IOB;
}
  • 实现dao层
package com.xpc.dao.impl;import com.xpc.dao.EmpDao;
import com.xpc.pojo.Emp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;@Repository
public class MyEmpDao implements EmpDao {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic int findEmpCount() {String sql = "select count(1) from emp";Integer integer = jdbcTemplate.queryForObject(sql, Integer.class);return integer;}@Overridepublic Emp findByEmp(int empno) {String sql = "select * from emp where EMPNO = ?";BeanPropertyRowMapper<Emp> rowMapper = new BeanPropertyRowMapper<>(Emp.class);Emp emp = jdbcTemplate.queryForObject(sql, rowMapper, empno);return emp;}
}

spring_MVC

M:model 模型层 DAO封装 mybatis
V:view 视图层 HTML
C:controller 控制层 Servlet封装 SpringMVC

@RequestMapping控制请求参数

package com.xpc.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class MyController {@RequestMapping("/MyCon.do")public String test(){return "sucess";}@RequestMapping(value = "/MyCon2.do",params = {"username!=root","passworld"})public String test2(){return "sucess";}@RequestMapping(value = "/MyCon.do",headers = "Accpet-Encoding=gzip")public String test3(){return "sucess";}
}

获取请求参数

package com.xpc.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@RestController
public class TestDataController {/*** 使用传统httpServletRequest获取参数*/@RequestMapping("/getParamByRequest.do")public String getParams1(HttpServletRequest req, HttpServletResponse resp){String username = req.getParameter("username");return "";}/*** 通过springMVC获取参数*/@RequestMapping("/getParamByArgName.do")public String getParams12(String username){System.out.println(username);return "";}
}

接收参数

  • POJO接收参数
package com.xpc.pojo;import java.io.Serializable;// 建立对应实体类
public class Person implements Serializable {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}
package com.xpc.controller;import com.xpc.pojo.Person;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ReceiveDataController {@RequestMapping("/getPojoData")public String getDataByPojo(Person p){// 传参进去 自动封装属性到 pSystem.out.println(p);return "success";}
}
  • 日期类型转换
    @DateTimeFormat 可以用于函数和对象上,用于解释用那种格式转换日期
package com.xpc.controller;import com.xpc.pojo.Person;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ReceiveDataController {@RequestMapping("/getPojoData")public String getDataByPojo(@DateTimeFormat(pattern = "yyyy-MM-dd")Data birthdate){/*** 告诉spring以这种 yyyy-MM-dd 格式解析日期*/System.out.println(birthdate);return "success";}
}
  • List,map集合接收参数
package com.xpc.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.util.ArrayList;
import java.util.Map;@AllArgsConstructor
@NoArgsConstructor
@Data
public class Person implements Serializable {private String name;private Data data;private ArrayList<Pet> petList;private Map<String,Pet> petMap;
}
  • 接收乱码
   <filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filer-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filer-mapping>

响应

  • 请求转发和响应重定向
package com.xpc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@RestController
public class ReceiveDataController {/*** 紧耦合*/@RequestMapping("demo1")public void changePage(HttpServletRequest req, HttpServletResponse resp) throws Exception {// 请求转发req.getRequestDispatcher("/forward.jsp").forward(req,resp);// 响应重定向resp.sendRedirect(req.getContextPath()+"/redirect.jsp");}/*** 返回字符串告诉要转发的路径* 通过关键字控制*/@RequestMapping("demo2")public String changePage(){// 如果关键字是forward,可以省略// '/' 表示当前路径下
//        return "forward:/forwardPage.jsp";return "redirect:/redirectPage.jsp";}// 视图转发@RequestMapping("demo3")public View changePage3(HttpServletRequest req){View v = null;v= new InternalResourceView("forward.jsp");v= new RedirectView(req.getContextPath()+"redirect.jsp");return  v;}@RequestMapping("demo5")public ModelAndView changPage5(){ModelAndView mv = new ModelAndView();mv.setView(new InternalResourceView("forward:forwardPage.jsp"));return mv;}
  • 响应JSON数据
    引入依赖
    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version></dependency>
 // ResponseBody表示返回值不跳转,以JSON格式解析@ResponseBody@RequestMapping("demo6")public Pet testAjax(){Pet pet = new Pet("tom");return pet;}

拦截器

Spring MVC中的拦截器类似于Servlet中的过滤器,它主要作用是拦截用户请求并作相应处理,比如可以进行权限验证,记录请求信息的日志,判断用户是否登录

  • 使用拦截器,需要对拦截器进行定义和配置
    1. 通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类
    2. 通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口实现类来定义
  • 拦截器和过滤器区别
    1. 拦截器SpringMVC的,而过滤器是servlet的
    2. 拦截器不依赖于servlet容器,由spring容器初始化
    3. 拦截器只能对action请求起作用,而过滤器则可以对所有请求起作用
    4. 拦截器可以访问action上下文,值栈里的对象,而过滤器不能
    5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只在初次被调用
    6. 拦截器可以获取IOC容器中的各个bean,而过滤器不方便,在拦截器中注入service,可以调用业务逻辑
package com.xpc.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {/**** @param request current HTTP request* @param response current HTTP response* @param handler chosen handler to execute, for type and/or instance evaluation* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 请求到达handler之前request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");request.getHeader("auth");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 处理单元返回ModelAndView时候拦截}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 渲染完毕但是还没给浏览器响应数据}
}

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

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

相关文章

【Webpack】HMR 热更新

HMR全称Hot Module Replacement&#xff0c;可以理解为模块热替换&#xff0c;指在应用程序运行过程中&#xff0c;替换、添加、删除模块&#xff0c;而无需重新刷新整个应用。 不使用热更新&#xff0c;我们在应用运行过程中修改了某个模块&#xff0c;通过自动刷新会导致整个…

MySQL--索引(3)

1.索引创建注意点 选择合适的字段 1.不为 NULL 的字段 索引字段的数据应该尽量不为 NULL&#xff0c;因为对于数据为 NULL 的字段&#xff0c;数据库较难优化。如果字段频繁被查询&#xff0c;但又避免不了为 NULL&#xff0c;建议使用 0,1,true,false 这样语义较为清晰的短值或…

Vue--解决error:0308010C:digital envelope routines::unsupported

原文网址&#xff1a;Vue--解决error:0308010C:digital envelope routines::unsupported_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决node.js在运行Vue项目时的报错&#xff1a;error:0308010C:digital envelope routines::unsupported。 问题描述 使用node.js运行Vu…

力扣3226 使两个整数相等的位更改次数

写的代码&#xff1a; class Solution { public:string cc(int num){string res"";while(num>0){int rnum % 2;resstatic_cast<char>(48r)res;num/2;}return res;}int minChanges(int n, int k) {int res0;string n2cc(n);string k2cc(k);int n_sizen2.siz…

机器人开源调度系统OpenTCS-6最新版本地源码运行

OpenTCS 项目使用 Gradle 而不是 Maven&#xff0c;那么需要使用 Gradle 来导入和构建项目。在 IntelliJ IDEA 中导入和运行使用 Gradle 的项目&#xff0c;可以按照以下步骤进行操作&#xff1a; 克隆 OpenTCS 源码 首先&#xff0c;克隆 OpenTCS 的源码到本地。您可以使用以…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十八章 驱动模块编译进内核

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

ASP.NET中的六大对象有哪些?以及各自的功能以及使用方式

在ASP.NET Web Forms中&#xff0c;并没有严格意义上的“六大对象”&#xff0c;但通常我们指的是与HTTP请求和响应处理紧密相关的几个内置对象。以下是这些对象及其功能、使用方式以及简单的实现源码示例&#xff1a; Response对象 功能&#xff1a;用于向客户端发送HTTP响应…

UWB实操:使用 litepoint 测线损 pathloss

使用 litepoint 测线损 pathloss 把信号线接到 litepoint 的RF1 和RF2。 注意: RF1 支持 VSG(TX) 和VSA(RX)RF2 只支持 VSG(TX)同一时间只能一个 VSG(TX)双击 LED STATUS,改变RF1和RF2的模式。 RF1:VSA(RX) RF2:VSG(TX) Technology选择GPRF

cf场+线性dp

Problem - B - Codeforces 思路&#xff1a; 这其实是一道数学题&#xff08;最开始一直在枚举&#xff0c;服啦&#xff09; 我们的目的是求最大利润 当a>b是时直接令k0,利润n*a即可 当a<b时存在两种情况&#xff1a; 1.b-a>n即所有b-i1的情况都>a&#xff0…

掌握Python:三本不可错过的经典书籍

强烈推荐Python初学者用这三本书入门! Python3剑客 一、《Python编程从入门到实践》 这本书适合零基础的Python读者&#xff0c;旨在帮助他们快速入门Python编程&#xff0c;并达到初级开发者的水平。书中深入浅出地介绍了Python的基础概念&#xff0c;如变量、循环、函数等…

【BUG】已解决:ModuleNotFoundError: No module named ‘tensorboard‘

ModuleNotFoundError: No module named ‘tensorboard‘ 目录 ModuleNotFoundError: No module named ‘tensorboard‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#…

爬虫学习4:爬取王者荣耀技能信息

爬虫&#xff1a;爬取王者荣耀技能信息&#xff08;代码和代码流程&#xff09; 代码 # 王者荣耀英雄信息获取 import time from selenium import webdriver from selenium.webdriver.common.by import By if __name__ __main__:fp open("./honorKing.txt", "…

主机加固,如何重塑产线工控安全的防勒索病毒生态

在数字化转型的浪潮中&#xff0c;企业信息安全面临着前所未有的挑战&#xff0c;尤其是针对主机层面的攻击手段愈发狡猾。MCK主机加固系统&#xff0c;作为新一代主机安全防护方案&#xff0c;凭借其独步业界的内核级签名校验技术和深度学习驱动的业务场景白名单策略&#xff…

【C++】马蹄集02 自守数II

输入正整数N&#xff0c;检查该数是否为自守数输出YES或者NO。当且仅当一个数的平方以与该数相同的数字结尾时该数称为自守数。 格式 输入格式&#xff1a;输入正整数N 输出格式&#xff1a;输出YES或者NO 样例1 输入&#xff1a;76 输出&#xff1a;YES 代码 利用substr…

Cookie Session Token

Cookie (小型文本文件) 存储位置&#xff1a; 客户端&#xff08;浏览器&#xff09;中的 Cookie。 工作原理&#xff1a; 登录&#xff1a;用户提交登录表单&#xff0c;服务器验证凭证&#xff08;如用户名和密码&#xff09;。 设置 Cookie&#xff1a;服务器在响应中设置…

Win10环境将Docker部署到非系统盘

Win10环境将Docker部署到非系统盘 目录 Win10环境将Docker部署到非系统盘 一、Docker官网客户端Docker Hub下载 二、windows环境的安装 三、正确的迁移步骤 3.1、确保你的系统分区至少3G的剩余空间&#xff1b; 3.2、默认方式安装Docker hub&#xff1b; 3.3、打开Dock…

2024年钉钉杯大数据竞赛的赛题

钉钉杯的含金量是相当大的&#xff0c;这个证书在多个方面都具有较高的价值。以下是对其含金量和证书有用性的详细分析&#xff1a; 含金量分析 国家级竞赛地位&#xff1a; 钉钉杯大数据挑战赛是由阿里巴巴旗下钉钉举办的全国大数据比赛&#xff0c;已被众多高校认定为国家C…

切换IP地址如何实现?

随着互联网的发展和普及&#xff0c;我们日常生活中的各种操作和通讯越来越依赖互联网。互联网上存在的一些问题和限制使得更换IP地址成为必要的步骤。下面我们将探讨在互联网业务中&#xff0c;需要更换IP地址的原因与方法。 一、IP轮换的应用 解决访问限制&#xff1a;解决访…

Java语言程序设计——篇五(1)

数组 概述数组定义实例展示实战演练 二维数组定义数组元素的使用数组初始化器实战演练&#xff1a;矩阵计算 &#x1f4ab;不规则二维数组实战演练&#xff1a;杨辉三角形 概述 ⚡️数组是相同数据类型的元素集合。各元素是有先后顺序的&#xff0c;它们在内存中按照这个先后顺…

分类预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测

分类预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测&#xff0…