ssm框架整合,异常处理器和拦截器(纯注解开发)
目录
ssm框架整合
第一步:指定打包方式和导入所需要的依赖
打包方法:war
springMVC所需依赖
解析json依赖
mybatis依赖
数据库驱动依赖
druid数据源依赖
junit依赖
第二步:导入tomcat插件
第三步:编写配置类
SpringConfig配置类
JdbcConfig配置类
MybatisConfig配置类
SpringMvcConfig配置类
ServletContainerInitConfig配置类
注意点:
第四步:准备数据库并写对应的pojo类型
第五步:编写dao层
第六步:编写service层
第七步:编写controller层
第八步:封装数据
响应码类
封装结果类
修改后的Controller
报错:这里我使用postman测试时,报错 No converter for [class com.hhh.pojo.vo.Result] with preset Content-Type 'null'
异常处理器
业务异常
系统异常
异常处理器
拦截器
如何定义拦截器
1.定义一个拦截器类,并实现HandlerInterceptor
2.配置加载拦截器
3.让SpringMVC加载此配置类
拦截器链
ssm框架整合
先自己创建Maven工程
第一步:指定打包方式和导入所需要的依赖
打包方法:war
<groupId>com.hhh</groupId><artifactId>spring_day7_ssm2</artifactId><version>1.0-SNAPSHOT</version> <!-- 使用war方式进行打包--><packaging>war</packaging>
springMVC所需依赖
<!-- springMVC依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency>
解析json依赖
<!-- json解析--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency>
mybatis依赖
<!-- mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.1.0</version></dependency>
数据库驱动依赖
<!-- 数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.13</version></dependency>
druid数据源依赖
<!-- druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency>
junit依赖
<!-- junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.2.10.RELEASE</version></dependency>
第二步:导入tomcat插件
<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><!-- 指定端口 --><port>8080</port><!-- 请求路径 --><path>/</path><uriEncoding>utf-8</uriEncoding><!-- <!–这个名称需要,在maven插件中显示应用名称–>--><!-- <server>tomcat7</server>--></configuration></plugin></plugins></build>
完整的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>com.hhh</groupId><artifactId>spring_day7_ssm2</artifactId><version>1.0-SNAPSHOT</version> <!-- 使用war方式进行打包--><packaging>war</packaging><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies> <!-- springMVC依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency> <!-- json解析--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency> <!-- mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.1.0</version></dependency> <!-- 数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.13</version></dependency> <!-- druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency> <!-- junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.2.10.RELEASE</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><!-- 指定端口 --><port>8080</port><!-- 请求路径 --><path>/</path><uriEncoding>utf-8</uriEncoding><!-- <!–这个名称需要,在maven插件中显示应用名称–>--><!-- <server>tomcat7</server>--></configuration></plugin></plugins></build></project>
第三步:编写配置类
SpringConfig配置类
@Configuration @ComponentScan({"com.hhh.dao","com.hhh.service"}) @PropertySource("classpath:jdbc.properties")//导入外部文件 @Import({JdbcConfig.class, MybatisConfig.class})//加载外部配置类 @EnableTransactionManagement//开启事务功能 public class SpringConfig { }
JdbcConfig配置类
//管理第三方技术 这个类写数据源和事务处理器 public class JdbcConfig {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String name;@Value("${jdbc.password}")private String password;@Beanpublic DataSource dataSource(){DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setDriverClassName(driver);druidDataSource.setUrl(url);druidDataSource.setUsername(name);druidDataSource.setPassword(password);return druidDataSource;}@Beanpublic PlatformTransactionManager manager(DataSource dataSource){//spring会根据类型自动注入相同类型的beanDataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource);return dataSourceTransactionManager;} }
MybatisConfig配置类
public class MybatisConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);sqlSessionFactoryBean.setTypeAliasesPackage("com.hhh.pojo");//设置pojo类别名return sqlSessionFactoryBean;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();mapperScannerConfigurer.setBasePackage("com.hhh.dao");//扫描dao层,并帮dao层的接口类创建代理对象beanreturn mapperScannerConfigurer;} }
SpringMvcConfig配置类
@Configuration @ComponentScan("com.hhh.controller") @EnableWebMvc//开启辅助功能 public class SpringMvcConfig { }
ServletContainerInitConfig配置类
public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {//加载spring核心配置类@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}//加载springMVC核心配置类@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}//设置哪些请求路径交给springMVC管理@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}//设置post中文请求乱码@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();characterEncodingFilter.setEncoding("utf-8");return new Filter[]{characterEncodingFilter};} }
注意点:
SpringMvc核心配置类和Spring配置类不能互相扫描,假如@Import({JdbcConfig.class, MybatisConfig.class})多了com.hhh.config,就会报错
Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method 'resourceHandlerMapping' threw exception; nested exception is java.lang.IllegalStateException: No ServletContext set
编写完配置类之后我们先启动项目看看,会不会出错
注意:启动之前现在main目录下创建一个webapp目录
没有问题
第四步:准备数据库并写对应的pojo类型
public class Book {private Integer id;private String name;private String description;private Integer score;@Overridepublic String toString() {return "Book{" +"id=" + id +", name='" + name + '\'' +", description='" + description + '\'' +", score=" + score +'}';}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public Integer getScore() {return score;}public void setScore(Integer score) {this.score = score;}}
第五步:编写dao层
由于修改操作需要id和Book类对象,所以重新写一个pojo类
public class UpdateBook {Integer id;Book book;@Overridepublic String toString() {return "UpdateBook{" +"id=" + id +", book=" + book +'}';}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Book getBook() {return book;}public void setBook(Book book) {this.book = book;} }
//这里不用写@Repository注解,因为MybatisConfig会扫描这一个包下的所有接口类,并创建代理对象 public interface BookDao {//新增操作@Insert("insert into book(name, description, score) VALUE (#{name},#{description},#{score});")@Options(useGeneratedKeys = true,keyColumn = "id",keyProperty = "id")//设置主键回填Integer save(Book book);//查询全部@Select("select * from book;")List<Book> getAll();//查询某一个@Select("select * from book where id=#{id};")Book getById(Integer id);//删除@Delete("delete from book where id=#{id};")Integer deleteById(Integer id);//修改/*@Update("update book set name=#{book.name},description=#{book.description},score=#{book.score} where id=#{id};")Integer updateById(@Param("id") Integer id, @Param("book") Book book);*/@Update("update book set name=#{book.name},description=#{book.description},score=#{book.score} where id=#{id};")Integer updateById(UpdateBook u); }
第六步:编写service层
BookService接口
@Transactional//开启事务管理 public interface BookService {//新增操作Boolean save(Book book);//查询全部List<Book> getAll();//查询某一个Book getById(Integer id);//删除Boolean deleteById(Integer id);//修改Boolean updateById(UpdateBook updateBook); }
BookServiceImpl实现类
@Service public class BookServiceImpl implements BookService {@Autowiredprivate BookDao bookDao;@Overridepublic Boolean save(Book book) {return bookDao.save(book)>0;//大于0为真}@Overridepublic List<Book> getAll() {return bookDao.getAll();}@Overridepublic Book getById(Integer id) {return bookDao.getById(id);}@Overridepublic Boolean deleteById(Integer id) {return bookDao.deleteById(id)>0;}@Overridepublic Boolean updateById(UpdateBook updateBook) {return bookDao.updateById(updateBook)>0;} }
测试一下
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SpringConfig.class)//加载spring核心配置类 public class BookServiceTest {@Autowiredprivate BookService bookService;@Testpublic void testGetAll(){List<Book> list = bookService.getAll();System.out.println(list);}@Testpublic void testGetById(){Book book= bookService.getById(2);System.out.println(book);}@Testpublic void testSave(){Book book = new Book();book.setName("hh");book.setDescription("aa");book.setScore(90);Boolean aBoolean = bookService.save(book);System.out.println(aBoolean);//trueSystem.out.println("id="+book.getId());//11}@Testpublic void testUpdate(){Book book = new Book();book.setName("hhh");book.setDescription("aaa");book.setScore(70);UpdateBook updateBook = new UpdateBook();updateBook.setBook(book);updateBook.setId(9);Boolean b = bookService.updateById(updateBook);System.out.println(b);}@Testpublic void testDelete(){Boolean b = bookService.deleteById(11);System.out.println(b);} }
全部正确
第七步:编写controller层
/*@ResponseBody @Controller*/ @RestController @RequestMapping(value = "/books",produces = "text/html;charset=utf-8") public class BookController {@Autowiredprivate BookService bookService;@PostMappingpublic String save(@RequestBody Book book){//解析json对象Boolean b = bookService.save(book);return b?"保存成功":"保存失败";//return "保存成功";}@GetMappingpublic List<Book>getAll(){return bookService.getAll();}@GetMapping("/{id}")public Book getById(@PathVariable Integer id){//从路径中获取值return bookService.getById(id);}@PutMappingpublic String update(@RequestBody UpdateBook book){Boolean b = bookService.updateById(book);return b?"修改成功":"修改失败";}@DeleteMapping("/{id}")public String delete(@PathVariable Integer id){//从路径中获取值Boolean b = bookService.deleteById(id);return b?"删除成功":"删除失败";} }
使用postman测试
完全正确
第八步:封装数据
响应码类
public class Code {public static final Integer SAVE_OK=10010;public static final Integer UPDATE_OK=10020;public static final Integer DELETE_OK=10030;public static final Integer SELECT_OK=10040;public static final Integer SAVE_ERR=10011;public static final Integer UPDATE_ERR=10021;public static final Integer DELETE_ERR=10031;public static final Integer SELECT_ERR=10041;}
封装结果类
public class Result {private Integer code;//响应码private Object data;//响应数据private String msg;//响应信息,可有可无@Overridepublic String toString() {return "Result{" +"code=" + code +", data=" + data +", msg='" + msg + '\'' +'}';}public Result(Integer code, Object data, String msg) {this.code = code;this.data = data;this.msg = msg;}public Result(Integer code, Object data) {this.code = code;this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}
修改后的Controller
/*@ResponseBody
@Controller*/
@RestController
@RequestMapping(value = "/books",produces = "application/json;charset=utf-8")
public class BookController {@Autowiredprivate BookService bookService;@PostMappingpublic Result save(@RequestBody Book book){//解析json对象Boolean b = bookService.save(book);Integer code=b? Code.SAVE_OK:Code.SAVE_ERR;String msg=b?"新增成功":"新增失败";return new Result(code,b,msg);}@GetMappingpublic Result getAll(){List<Book> bookList = bookService.getAll();Integer code=bookList!=null?Code.SELECT_OK:Code.SELECT_ERR;String msg=bookList!=null?"查询成功":"查询失败";return new Result(code,bookList,msg);}@GetMapping("/{id}")public Result getById(@PathVariable Integer id){//从路径中获取值Book book = bookService.getById(id);Integer code=book!=null?Code.SELECT_OK:Code.SELECT_ERR;String msg=book!=null?"查询成功":"查询失败";return new Result(code,book,msg);}@PutMappingpublic Result update(@RequestBody UpdateBook book){Boolean b = bookService.updateById(book);Integer code=b? Code.UPDATE_OK:Code.UPDATE_ERR;String msg=b?"修改成功":"修改失败";return new Result(code,b,msg);}@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id){//从路径中获取值Boolean b = bookService.deleteById(id);Integer code=b? Code.DELETE_OK:Code.DELETE_ERR;String msg=b?"删除成功":"删除失败";return new Result(code,b,msg);}
}
报错:
这里我使用postman测试时,报错 No converter for [class com.hhh.pojo.vo.Result] with preset Content-Type 'null'
解决方法:
把@RequestMapping(value = "/books",produces = {"text/html;charset=UTF-8"})改成
@RequestMapping(value = "/books",produces = {"application/json;charset=UTF-8"})
异常处理器
我们可以把出现的异常封装成结果类,返回给前端
@RestControllerAdvice
//包好了@ResponseBody,@Component注解
public class ProjectExceptionAdvice {@ExceptionHandler(Exception.class)//告诉spring这是处理异常的,负责处理Exception异常public Result doException(Exception e){return new Result(Code.ERR,null,"项目出错");}
}
还需要在Spring核心配置类中扫描到这个包,如果没有写,异常处理器就不会生效
@Configuration @ComponentScan({"com.hhh.dao","com.hhh.service","com.hhh.exception"}) @PropertySource("classpath:jdbc.properties")//导入外部文件 @Import({JdbcConfig.class, MybatisConfig.class})//加载外部配置类 @EnableTransactionManagement//开启事务功能 public class SpringConfig { }
我们随便写一个异常
结果:
我们可以把我们常见的异常分成
业务异常和系统出错异常
public static final Integer ERR=0;public static final Integer BUSINESS_ERR=20101;public static final Integer SYSTEM_ERR=20202;
先添加三个code编码
业务异常
public class BusinessException extends RuntimeException{private Integer code;public BusinessException(Integer code,String message) {super(message);this.code=code;}public BusinessException(Integer code,String message, Throwable cause) {super(message, cause);this.code=code;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}
}
系统异常
public class SystemException extends RuntimeException{private Integer code;;public SystemException(Integer code,String message) {super(message);this.code=code;}public SystemException(Integer code,String message, Throwable cause) {super(message, cause);this.code=code;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}
}
异常处理器
@RestControllerAdvice
//包好了@ResponseBody,@Component注解
public class ProjectExceptionAdvice {@ExceptionHandler(BusinessException.class)//处理BusinessException异常public Result doBusinessException(BusinessException e){//接收程序传过来的异常return new Result(e.getCode(),null,e.getMessage());}@ExceptionHandler(SystemException.class)//处理SystemException异常public Result doSystemException(SystemException e){return new Result(e.getCode(),null,e.getMessage());}@ExceptionHandler(Exception.class)//告诉spring这是处理异常的,负责处理Exception异常public Result doException(Exception e){return new Result(Code.ERR,null,"项目出错");}
}
测试
成功:
拦截器
拦截器是一种动态拦截方法的机制
作用:
- 在指定方法调用前后执行预先设定后的代码
- 阻止原始方法的执行
如何定义拦截器
1.定义一个拦截器类,并实现HandlerInterceptor
@Component//交给容器管理
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");//执行原方法之前return true;//返回true才能放行去访问controller}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandler");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");}
}
spring核心配置类扫描该自定义的拦截器类,并生成bean
@Configuration
@ComponentScan({"com.hhh.dao","com.hhh.service","com.hhh.exception","com.hhh.interceptor"})
@PropertySource("classpath:jdbc.properties")//导入外部文件
@Import({JdbcConfig.class, MybatisConfig.class})//加载外部配置类
@EnableTransactionManagement//开启事务功能
public class SpringConfig {
}
2.配置加载拦截器
public class SpringWebSupport implements WebMvcConfigurer {@Autowiredprivate MyInterceptor myInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor).addPathPatterns("/books");//设置拦截的路径}
}
3.让SpringMVC加载此配置类
@Configuration
@ComponentScan("com.hhh.controller")
@EnableWebMvc//开启辅助功能
@Import(SpringWebSupport.class)
public class SpringMvcConfig {
}
结果:
拦截器链
- 当配置多个拦截器时,形成拦截器链
- 拦截器链的运行顺序参照拦截器添加的顺序为准
- 当拦截器中出现对原始拦截器的拦截(返回false),后面的拦截器均终止运行(后面的preHandler方法,所有postHandle方法和包括自身的afterCompletion方法都不执行)
- 当拦截器中断,仅运行配置在前面的拦截器的afterCompletion
添加其他的拦截器
加载这些拦截器
public class SpringWebSupport implements WebMvcConfigurer {@Autowiredprivate MyInterceptor myInterceptor;@Autowiredprivate MyInterceptor2 myInterceptor2;@Autowiredprivate MyInterceptor3 myInterceptor3;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor).addPathPatterns("/books","/books/*");//设置拦截的路径registry.addInterceptor(myInterceptor2).addPathPatterns("/books","/books/*");registry.addInterceptor(myInterceptor3).addPathPatterns("/books","/books/*");}
}
执行的顺序就是加载的顺序
结果:
相关文章:

ssm框架整合,异常处理器和拦截器(纯注解开发)
目录 ssm框架整合 第一步:指定打包方式和导入所需要的依赖 打包方法:war springMVC所需依赖 解析json依赖 mybatis依赖 数据库驱动依赖 druid数据源依赖 junit依赖 第二步:导入tomcat插件 第三步:编写配置类 SpringCon…...

古籍双层PDF制作教程:保姆级古籍数字化教程
在智慧古籍数字化项目中,很多图书馆要求将古籍导出为双层PDF,并且确保输出双层PDF底层文本与上层图片偏移量控制在1毫米以内。那么本教程带你使用古籍数字化平台,3分钟把一个古籍书籍转化为双侧PDF。 第1步:上传古籍 点批量上传…...

Git 删除 远端的分支
要删除 Git 远端的分支(例如: V3.2.1.13): 可以执行以下命令 git push origin --delete V3.2.1.13这条命令会向远端的仓库删除名为 V3.2.1.13 的分支。如果这个分支只在远端仓库存在而没有对应的本地分支,那么删除后这…...

PrgogressBar实现原理分析
ProgressBar 是 Android 中用于显示进度条的控件,它可以用来表示任务的完成程度或者加载进度等信息。ProgressBar 有两种主要类型:一种是确定性的(determinate),另一种是不确定性的(indeterminateÿ…...

【HarmonyOS】HarmonyOS NEXT学习日记:七、页面与组件的生命周期
【HarmonyOS】HarmonyOS NEXT学习日记:七、页面与组件的生命周期 页面和组件 组件:用Component装饰的代码称为自定义组件页面:Entry装饰的组件即页面的根节点 组件生命周期 aboutToAppear:在创建自定义组件的新实例后…...

【iOS】——Block循环引用
循环引用原因 如果在Block中使用附有_ _strong修饰符的对象类型自动变量,那么当Block从栈复制到堆时,该对象为Block所持有,这样容易引起循环引用。 HPPerson *person [[HPPerson alloc] init];person.block ^{NSLog("person.age--- …...

shell脚本自动化安装启动各种服务
1、自动化配置dns服务器 A主机:vim dns.sh #!/bin/bash# 自动化部署dns# 1、下载bind# 2、修改配置文件# vim /etc/named.conf # listen-on port 53 { 127.0.0.1;any; }; 修改(定位替换)# allow-query { localhost;any; }; 修改&am…...

Python - 开源库 ReportLab 库合并 CVS 和图像生成 PDF 文档
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140281680 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Report…...

Java编写SIP协议
1、编写Server代码 package com.genersoft.iot.vmp.sip; import javax.sip.*; import javax.sip.message.*; import javax.sip.header.*; import java.util.*;public class SimpleSipServer implements SipListener {private SipFactory sipFactory;private SipStack sipStack…...

大型语言模型LLM的核心概念
本文主要介绍了目前主流的,几个大型语言模型LLM的整个训练过程 通常分为下面的几个阶段 1. 预训练 采用互联网上的大量数据进行训练,这一阶段大模型LLM的主体已定,找出共性并且压缩成一个模型。模型的参数量不是越大越好,遵循合理…...

软件测试---网络基础、HTTP
一、网络基础 (1)Web和网络知识 网络基础TCP/IP 使用HTTP协议访问Web WWW万维网的诞生 WWW万维网的构成 (2)IP协议 (3)可靠传输的TCP和三次握手策略 (4)域名解析服务DNS ࿰…...

韩顺平0基础学java——第39天
p820-841 jdbc和连接池 1.JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。 2.Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。 3.jdbc原理图 JDBC带来的好处 2.JDBC带来的…...

Linux文件恢复
很麻烦 一般还是小心最好 特别恢复的时候 可能不能选择某个文件夹去扫描恢复 所以 删除的时候 用rm -i代替rm 一定小心 以及 探索下linux的垃圾箱机制 注意 一定要恢复到不同文件夹 省的出问题 法1 系统自带工具 debugfs 但是好像不能重启? testdisk 1、安装 …...

大数据的数据质量有效提升的研究
大数据的数据质量有效提升是一个涉及多个环节和维度的复杂过程。以下是从数据采集、处理、管理到应用等方面,对大数据数据质量有效提升的研究概述: 一、数据采集阶段 明确采集需求:在数据采集前,需明确数据需求,包括…...

Flink-CDC解析(第47天)
前言 本文主要概述了Flink-CDC. 1. CDC 概述 1.1 什么是CDC? CDC是(Change Data Capture 变更数据获取)的简称 ,在广义的概念上,只要是能捕获数据变更的技术,都可以称之为 CDC。 核心思想是,…...

二阶段测试
二阶段测试 1、部署框架前准备工作 服务器类型部署组件ip地址DR1调度服务器 主(ha01)KeepalivedLVS-DR192.168.168.21DR2调度服务器 备 (ha02)KeepalivedLVS-DR192.168.168.22web1节点服务器 (slave01)NginxTomcatMySQL 备MHA managerMHA node192.168.1…...

CSP-J模拟赛day1——解析+答案
题目传送门 yjq的吉祥数 题解 送分题,暴力枚举即可 Code #include<bits/stdc.h> using namespace std;int l,r; int num1,tmp0,q[10000],a[10000]; int k (int x){for (int j1;j<tmp;j){if (xq[j])return 0;}return 1; } int main(){while (num<100…...

【PostgreSQL案例】我要查的表没有在执行计划中
问题:查的表没有在执行计划中 sql: SELECT* FROM(SELECTA.column1 as "column1",--中间省略很多A字段A.column99 as "column99"fromtable_a Aleft join (SELECTlzl_idfromtable_a AAinner join table_b BB ON AA.lzl_key BB.lzl_…...

《程序猿入职必会(5) · CURD 页面细节规范 》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...

操作系统面试知识点总结5
#来自ウルトラマンメビウス(梦比优斯) 1 IO管理概述 1.1 I/O 设备 I/O 设备的类型分类。 1.1.1 按使用特性 人机交互类外部设备,例如打印机、显示器等。存储设备,例如磁盘、光盘等。网络通信设备,例如网络接口等。 1…...

BigInteger和BigDecimal类
一、应用场景 1. BigInteger 类 目前,我们学过最大的是long类型,但是,在实际开发时候,很有可能遇见超出long类型范围的数,我们就需要用BigInteger类; ① add 加 ② subtract 减 ③ multiply 乘…...

2024最新Uniapp的H5网页版添加谷歌授权验证
现在教程不少,但是自从谷歌升级验证之后,以前的老教程就失效了,现在写一个新教程以备不时之需。 由于众所周知的特殊原因,开发的时候一定注意网络环境,如果没有梯子是无法进行开发的哦~ clientID的申请方式我就不再进…...

学习java第一百四十四天
Spring通知有哪些类型? 在AOP术语中,切面的工作被称为通知。通知实际上是程序运行时要通过Spring AOP框架来触发的代码段。 Spring切面可以应用5种类型的通知: 前置通知(Before):在目标方法被调用之前调用通…...

Meta 发布 Llama3.1,一站教你如何推理、微调、部署大模型
最近这一两周看到不少互联网公司都已经开始秋招提前批了。不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解…...

XSSFWorkbook 和 SXSSFWorkbook 的区别
在现代办公环境中,处理 Excel 文件是一个常见的任务。Apache POI 是一个流行的 Java 库,能够读写 Microsoft Office 文档。对于处理 Excel 文件,Apache POI 提供了 XSSFWorkbook 和 SXSSFWorkbook 两个类。本文将详细介绍这两个类的特点和适用…...

会议主题:NICE Seminar|神经组合优化方法的大规模泛化研究(南方科技大学王振坤副研究员)
数据增强 获得更多解 TSP问题 最优解与序列无关,数据增强 ICML 2024 Position Rethinking Post-Hoc Search-Based Neural Approaches for Solving Large-Scale Traveling Salesman Problems...

昇思25天学习打卡营第22天|CycleGAN图像风格迁移互换
相关知识 CycleGAN 循环生成网络,实现了在没有配对示例的情况下将图像从源域X转换到目标域Y的方法,应用于域迁移,也就是图像风格迁移。上章介绍了可以完成图像翻译任务的Pix2Pix,但是Pix2Pix的数据必须是成对的。CycleGAN中只需…...

《Java初阶数据结构》----6.<优先级队列之PriorityQueue底层:堆>
前言 大家好,我目前在学习java。之前也学了一段时间,但是没有发布博客。时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…...

Matrix Equation(高斯线性异或消元+bitset优化)
题目: 登录—专业IT笔试面试备考平台_牛客网 思路: 我们发现对于矩阵C可以一列一列求。 mod2,当这一行相乘1的个数为奇数时,z(i,j)为1,偶数为0,是异或消元。 对于b[i,j]*c[i,j],b[i,j]可以…...

【一图学技术】2.API测试9种方法图解
9种API测试方法 冒烟测试:冒烟测试是一种快速的表面级测试,用于验证软件的基本功能是否正常工作,以确定是否值得进行更详细的测试。功能测试:功能测试是验证软件是否符合预期功能要求的测试类型。它涉及对每个功能进行测试&#…...