ssm框架搭建连接mysql_从零开始搭建SSM框架(Spring + Spring MVC + Mybatis)

最近在回顾和总结一些技术,想到了把之前比较火的 SSM 框架重新搭建出来,作为一个小结,同时也希望本文章写出来能对大家有一些帮助和启发,因本人水平有限,难免可能会有一些不对之处,欢迎各位大神拍砖指教,共同进步。

本文章示例使用 IntelliJ IDEA 来开发,JDK 使用 11 版本,其余各框架和技术基本上使用了文章撰写当时的最新版本。

好的,下面直接进入正题。

打开 IntelliJ IDEA,File > New > Project > Maven,选中“Create from archetype”,然后再选中“org.apache.maven.archetypes:maven-archetype-webapp”:

85155dce5acf2e1200bdfcfb105dfee6.png

Next,输入项目的“GroupId”、“ArtifactId”和Version:

e32b15c4bd46a58be19e9be48469c85f.png

Next,指定“Maven home directory”等配置:

0d3746bfe8a0b9e7acca6d4a6ab96ced.png

Next,修改Project Name:

aaefa7b1a9b4ffa23c980384ac4bd40a.png

Finish,打开项目,添加一些必要的目录,最终项目框架目录图如下:

d9d17ab70aa8932cea6f1570d8917338.png

修改pom.xml文件,指定各依赖和插件的版本等信息:

UTF-8

11

11

11

5.2.3.RELEASE

4.13

1.18.10

3.3.1

2.3.29

1.1.21

3.1

8.0.19

1.2

4.0.1

2.3.3

2.9.2

3.9

2.10.2

1.3.1.Final

2.13.0

1.7.30

3.1.0

3.1.0

3.8.1

3.0.0-M4

3.2.3

3.0.0-M1

3.0.0-M1

在标签里面管理各依赖的版本号:

org.springframework

spring-context

${spring.version}

org.springframework

spring-context-support

${spring.version}

org.springframework

spring-beans

${spring.version}

org.springframework

spring-jdbc

${spring.version}

org.springframework

spring-aop

${spring.version}

org.springframework

spring-aspects

${spring.version}

org.springframework

spring-webmvc

${spring.version}

org.springframework

spring-test

${spring.version}

test

junit

junit

${junit.version}

test

org.projectlombok

lombok

${lombok.version}

provided

com.baomidou

mybatis-plus

${mybatis-plus.version}

com.baomidou

mybatis-plus-generator

${mybatis-plus.version}

test

true

org.freemarker

freemarker

${freemarker.version}

test

true

com.alibaba

druid

${druid.version}

com.github.jsqlparser

jsqlparser

${jsqlparser.version}

mysql

mysql-connector-java

${mysql-connector.version}

javax.servlet.jsp.jstl

jstl-api

${jstl-api.version}

javax.servlet

javax.servlet-api

${servlet-api.version}

provided

javax.servlet.jsp

javax.servlet.jsp-api

${jsp-api.version}

provided

io.springfox

springfox-swagger2

${springfox-swagger.version}

io.springfox

springfox-swagger-ui

${springfox-swagger.version}

org.apache.commons

commons-lang3

${commons-lang3.version}

com.fasterxml.jackson.core

jackson-databind

${jackson.version}

com.fasterxml.jackson.core

jackson-annotations

${jackson.version}

compile

org.mapstruct

mapstruct

${mapstruct.version}

org.slf4j

slf4j-api

${slf4j.version}

org.apache.logging.log4j

log4j-slf4j-impl

${log4j.version}

添加项目依赖:

org.springframework

spring-context-support

org.springframework

spring-jdbc

org.springframework

spring-aspects

org.springframework

spring-webmvc

org.springframework

spring-test

junit

junit

org.projectlombok

lombok

com.baomidou

mybatis-plus

com.baomidou

mybatis-plus-generator

org.freemarker

freemarker

com.alibaba

druid

mysql

mysql-connector-java

javax.servlet.jsp.jstl

jstl-api

javax.servlet

javax.servlet-api

javax.servlet.jsp

javax.servlet.jsp-api

io.springfox

springfox-swagger2

io.springfox

springfox-swagger-ui

org.apache.commons

commons-lang3

com.fasterxml.jackson.core

jackson-databind

org.mapstruct

mapstruct

org.apache.logging.log4j

log4j-slf4j-impl

管理:

ssm

org.apache.maven.plugins

maven-clean-plugin

${clean.plugin.version}

org.apache.maven.plugins

maven-resources-plugin

${resources.plugin.version}

${project.build.sourceEncoding}

org.apache.maven.plugins

maven-compiler-plugin

${compiler.plugin.version}

${maven.compiler.source}

${maven.compiler.target}

${project.build.sourceEncoding}

org.projectlombok

lombok

${lombok.version}

org.mapstruct

mapstruct-processor

${mapstruct.version}

-Amapstruct.defaultComponentModel=spring

-Amapstruct.unmappedTargetPolicy=IGNORE

org.apache.maven.plugins

maven-surefire-plugin

${surefire.plugin.version}

org.apache.maven.plugins

maven-war-plugin

${war.plugin.version}

org.apache.maven.plugins

maven-install-plugin

${install.plugin.version}

org.apache.maven.plugins

maven-deploy-plugin

${deploy.plugin.version}

依赖配置好之后,开始整合。

先整合Log4j2日志,在项目classpath目录(src/main/resources)下创建log4j2.xml文件,添加Log4j2日志配置:

再整合 Spring 和 Mybatis,本次还整合了 Mybatis Plus 开源框架,新建 src/main/resources/mybatis/mybatis-config.xml 文件:

/p>

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

新建 src/main/resources/properties/jdbc.properties 文件,配置数据源连接信息:

jdbc.driver-class-name=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8

jdbc.username=root

jdbc.password=root

新建 src/main/resources/spring/applicationContext-dao.xml 文件,配置 Druid 数据源,SqlSessionFactory 会话工厂,Mybatis 的 Mapper 接口扫描等信息:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

com.example.ssm.service.*

com.example.ssm.mapper.*

class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"/>

class="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor"/>

新建 src/main/resources/spring/applicationContext-tx.xml 文件,配置事务:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

配置 Mybatis Plus 自动生成 Controller、Service 和 Mapper 文件:

// 自动代码生成器

AutoGenerator autoGenerator = new AutoGenerator();

// 全局配置

GlobalConfig globalConfig = new GlobalConfig();

String projectPath = System.getProperty("user.dir");

globalConfig.setOutputDir(projectPath + "/src/main/java");

globalConfig.setAuthor("calvinit");

globalConfig.setOpen(false);

globalConfig.setFileOverride(true);

autoGenerator.setGlobalConfig(globalConfig);

// 数据源配置

DataSourceConfig dataSourceConfig = new DataSourceConfig();

dataSourceConfig.setDbType(DbType.MYSQL);

dataSourceConfig.setUrl("jdbc:mysql://127.0.0.1:3306/ssm?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8");

// dataSourceConfig.setSchemaName("public");

dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");

dataSourceConfig.setUsername("root");

dataSourceConfig.setPassword("root");

autoGenerator.setDataSource(dataSourceConfig);

// 包配置

PackageConfig packageConfig = new PackageConfig();

packageConfig.setParent("com.example.ssm");

autoGenerator.setPackageInfo(packageConfig);

// 自定义配置

InjectionConfig injectionConfig = new InjectionConfig() {

@Override

public void initMap() {

// to do nothing

}

};

// 如果模板引擎是 freemarker

String templatePath = "/templates/mapper.xml.ftl";

// 自定义输出配置

List focList = new ArrayList<>();

// 自定义配置会被优先输出

focList.add(new FileOutConfig(templatePath) {

@Override

public String outputFile(TableInfo tableInfo) {

tableInfo.setImportPackages("com.baomidou.mybatisplus.annotation.TableName");

tableInfo.setConvert(true);

// 自定义输出文件名

return projectPath + "/src/main/resources/mapper/"

+ tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;

}

});

injectionConfig.setFileOutConfigList(focList);

autoGenerator.setCfg(injectionConfig);

// 配置模板

TemplateConfig templateConfig = new TemplateConfig();

// 配置自定义输出模板

// templateConfig.setEntity(ConstVal.TEMPLATE_ENTITY_JAVA);

// templateConfig.setService(ConstVal.TEMPLATE_SERVICE);

// templateConfig.setController(ConstVal.TEMPLATE_CONTROLLER);

templateConfig.setXml(null);

autoGenerator.setTemplate(templateConfig);

// 策略配置

StrategyConfig strategy = new StrategyConfig();

strategy.setNaming(NamingStrategy.underline_to_camel);

strategy.setColumnNaming(NamingStrategy.underline_to_camel);

// strategy.setSuperEntityClass("com.example.ssm.entity.BaseEntity");

strategy.setEntityLombokModel(true);

strategy.setEntityColumnConstant(true);

strategy.setRestControllerStyle(true);

// strategy.setSuperControllerClass("com.example.ssm.controller.BaseController");

strategy.setInclude("t_user", "t_group", "t_user_group_relation");

// strategy.setSuperEntityColumns("id");

strategy.setControllerMappingHyphenStyle(true);

strategy.setTablePrefix(packageConfig.getModuleName() + "_");

strategy.setEntityTableFieldAnnotationEnable(true);

autoGenerator.setStrategy(strategy);

autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine());

autoGenerator.execute();

然后整合 Spring 和 Spring MVC,其中对日期类型返回json作了自定义格式化处理:

import com.fasterxml.jackson.core.JsonGenerator;

import com.fasterxml.jackson.databind.JsonSerializer;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.SerializerProvider;

import com.fasterxml.jackson.databind.module.SimpleModule;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.time.LocalDate;

import java.time.LocalDateTime;

import java.time.LocalTime;

import java.time.format.DateTimeFormatter;

/**

* Jackson ObjectMapper 工厂类

*/

public class ObjectMapperFactory {

public static ObjectMapper getMapper() {

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

SimpleModule module = new SimpleModule();

module.addSerializer(LocalDate.class, new LocalDateSerializer());

module.addSerializer(LocalTime.class, new LocalTimeSerializer());

module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());

objectMapper.registerModule(module);

return objectMapper;

}

static class LocalDateSerializer extends JsonSerializer {

private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

/**

* {@inheritDoc}

*/

@Override

public void serialize(LocalDate value, JsonGenerator jgen, SerializerProvider provider) throws IOException {

jgen.writeString(DATE_FORMATTER.format(value));

}

}

static class LocalDateTimeSerializer extends JsonSerializer {

private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

/**

* {@inheritDoc}

*/

@Override

public void serialize(LocalDateTime value, JsonGenerator jgen, SerializerProvider provider) throws IOException {

jgen.writeString(DATE_TIME_FORMATTER.format(value));

}

}

static class LocalTimeSerializer extends JsonSerializer {

private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");

/**

* {@inheritDoc}

*/

@Override

public void serialize(LocalTime value, JsonGenerator jgen, SerializerProvider provider) throws IOException {

jgen.writeString(TIME_FORMATTER.format(value));

}

}

}

还集成了 Swgger UI ,方便接口调试:

import org.springframework.context.annotation.Bean;

import springfox.documentation.builders.ApiInfoBuilder;

import springfox.documentation.builders.PathSelectors;

import springfox.documentation.builders.RequestHandlerSelectors;

import springfox.documentation.service.ApiInfo;

import springfox.documentation.service.Contact;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spring.web.plugins.Docket;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

@EnableSwagger2

public class Swagger2Configuration {

@Bean("docket")

public Docket createDocket() {

return new Docket(DocumentationType.SWAGGER_2)

.select()

.apis(RequestHandlerSelectors.basePackage("com.example.ssm.controller"))

.paths(PathSelectors.any())

.build()

.apiInfo(apiInfo());

}

private ApiInfo apiInfo() {

Contact contact = new Contact("calvinit", "https://gitee.com/calvinit/ssm-demo", "");

return new ApiInfoBuilder()

.title("SSM框架搭建Demo")

.description("SSM框架搭建Demo,仅供猿友们学习交流之用,请勿用于商业用途")

.contact(contact)

.version("1.0-RELEASE")

.build();

}

}

新建 src/main/resources/spring/spring-mvc.xml 文件:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

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.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

application/json;charset=UTF-8

同时整合了MapStruct,方便 Entity、DTO 和 VO 等之间的转换,使用示例:

import com.example.ssm.entity.User;

import com.example.ssm.vo.UserVo;

import org.mapstruct.InheritInverseConfiguration;

import org.mapstruct.Mapper;

import org.mapstruct.Mapping;

import org.mapstruct.Mappings;

import java.util.List;

@Mapper

public interface UserVoConverter {

@Mappings({

@Mapping(source = "id", target = "userId"),

@Mapping(source = "name", target = "userName"),

@Mapping(target = "createDt", dateFormat = "yyyy-MM-dd HH:mm:ss"),

@Mapping(target = "lastUpdateDt", dateFormat = "yyyy-MM-dd HH:mm:ss")

})

UserVo entityToVo(User user);

List batchEntityToVo(List userList);

@InheritInverseConfiguration

User voToEntity(UserVo userVo);

List batchVoToEntity(List userVoList);

}

新建 src/main/resources/spring/applicationContext-common.xml 文件,配置 MapStruct 的 bean 被 Spring 管理:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

修改 web.xml 文件:

xmlns="http://xmlns.jcp.org/xml/ns/javaee"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"

id="WebApp_ID" version="4.0">

ssm

contextConfigLocation

classpath:spring/applicationContext-*.xml

log4jConfigLocation

classpath:log4j2.xml

characterEncodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

UTF-8

characterEncodingFilter

/*

druidWebStatFilter

com.alibaba.druid.support.http.WebStatFilter

exclusions

*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*

profileEnable

true

druidWebStatFilter

/*

org.springframework.web.context.ContextLoaderListener

dispatcherServlet

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:spring/spring-mvc.xml

1

dispatcherServlet

/

druidStatView

com.alibaba.druid.support.http.StatViewServlet

allow

127.0.0.1

loginUsername

user

loginPassword

password

resetEnable

true

druidStatView

/druid/*

index.jsp

修改 index.jsp 文件:

ssm

Hello World!

打开 Swagger UI

至此,框架基本整合完毕,下面写一个测试 Contoller 测试 Spring 和 Spring MVC 整合结果:

package com.example.ssm.controller;

import com.google.common.collect.Maps;

import io.swagger.annotations.Api;

import io.swagger.annotations.ApiOperation;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import springfox.documentation.annotations.ApiIgnore;

import java.util.Map;

@Api(tags = "首页控制器")

@Controller

@RequestMapping

public class IndexController {

@ApiIgnore

@ApiOperation(value = "首页")

@GetMapping

public String index() {

return "index";

}

@ApiOperation(value = "返回纯字符串")

@GetMapping("/hello")

@ResponseBody

public String hello() {

return "Hello World!";

}

@ApiOperation(value = "测试日期 json 返回")

@GetMapping("/date/test")

@ResponseBody

public Map testDate() {

Map map = Maps.newHashMap();

map.put("java.util.Date", new java.util.Date());

map.put("java.sql.Date", new java.sql.Date(System.currentTimeMillis()));

map.put("java.time.LocalDate", java.time.LocalDate.now());

map.put("java.time.LocalTime", java.time.LocalTime.now());

map.put("java.time.LocalDateTime", java.time.LocalDateTime.now());

return map;

}

}

右上角“Add Configuration”添加 Tomcat 配置,将项目部署信息配置好:

71d364ea2206851176362c27896f5cbe.png

87d8eb357c91e47538d364ce9dfdcb34.png

然后我们启动 Tomcat,打开 http://localhost:8080/ssm,如果正常,应该显示如下界面:

9177929cc1bf35cb5389eb21aaa4bd05.png

点击界面上的超链接,进入 Swagger UI 的界面。

再测试一下 Spring 和 Mybatis 整合是否完成:

package com.example.ssm.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;

import com.baomidou.mybatisplus.core.metadata.IPage;

import com.baomidou.mybatisplus.core.metadata.OrderItem;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import com.example.ssm.converter.UserVoConverter;

import com.example.ssm.entity.User;

import com.example.ssm.service.IUserService;

import com.example.ssm.vo.PageVo;

import com.example.ssm.vo.UserVo;

import io.swagger.annotations.Api;

import io.swagger.annotations.ApiOperation;

import io.swagger.annotations.ApiParam;

import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api

@RestController

@RequestMapping("/users")

public class UserController {

private IUserService userService;

private UserVoConverter userVoConverter;

public UserController(IUserService userService, UserVoConverter userVoConverter) {

this.userService = userService;

this.userVoConverter = userVoConverter;

}

@ApiOperation(value = "分页查询用户列表")

@GetMapping("/page")

@ResponseBody

public PageVo page(

@ApiParam(value = "当前页", required = true, defaultValue = "1", example = "1")

@RequestParam("pageNum") int pageNum,

@ApiParam(value = "页面大小", required = true, defaultValue = "10", example = "10")

@RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {

Page page = new Page<>();

page.setSize(pageSize);

page.setCurrent(pageNum);

page.addOrder(OrderItem.asc(User.CREATE_DT), OrderItem.asc(User.LAST_UPDATE_DT));

IPage userPage = userService.selectPage(page);

List userList = userPage.getRecords();

List userVoList = userVoConverter.batchEntityToVo(userList);

return PageVo.builder()

.pageNum(userPage.getCurrent())

.pageSize(userPage.getSize())

.pageTotal(userPage.getPages())

.rowTotal(userPage.getTotal())

.rowList(userVoList)

.build();

}

@ApiOperation(value = "查询某个用户")

@GetMapping("/{id}")

@ResponseBody

public User page(

@ApiParam(value = "用户Id", required = true, example = "1")

@PathVariable(value = "id") int id) {

return userService.selectByPrimaryKey(id);

}

@ApiOperation(value = "获取所有00后用户列表")

@GetMapping("/00/list")

@ResponseBody

public List list00() {

LambdaQueryWrapper userLambdaQueryWrapper = Wrappers.lambdaQuery();

userLambdaQueryWrapper.ge(User::getBirthday, "2000-01-01");

return userService.list(userLambdaQueryWrapper);

}

}

在 Swagger UI 的界面里面测试接口,返回正确:

e9d81a4a8e89a6873f853f7de785be66.png

586ecd01c34d331d09cf2565e90c7398.png

另外,Druid 的监控信息页面链接为:http://localhost:8080/ssm/druid/index.html,访问白名单、账号和密码在 web.xml 文件中配置。

至此,SSM 框架集成完毕,测试通过!

因篇幅关系,一些代码并没有在此文章中展现,可到我的Gitee上看完整框架代码。

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

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

相关文章

基于TFS实践敏捷-可视化管理

TFS是基于微软平台一套不错的系统&#xff0c;支持源码管理运行调试持续集成自动化测试Bug管理代码评审任务项管理文档管理沟通管理。 基于TFS 2015实践看板管理&#xff0c;让团队的数据可视化&#xff0c;让大家更多的关心产品、关注团队的努力&#xff0c;增强沟通、及时反映…

[转载]基于TFS实践敏捷-修复Bug和执行代码评审

本主题阐释了这些功能&#xff0c;以继续这一关注虚拟敏捷团队成员的一天的教程。 Peter 忙于编写一些代码以完成积压工作 (backlog) 项任务。但是&#xff0c;他的同事发现了一个阻碍他们工作的 Bug&#xff0c;他想立即修复此 Bug。 他暂停了手中的工作并修复此 Bug。 他请求…

单元测试入门

https://docs.microsoft.com/zh-cn/visualstudio/test/getting-started-with-unit-testing?viewvs-2019 使用 Visual Studio 定义和运行单元测试&#xff0c;使代码保持正常运行、确保代码覆盖率并在客户之前找到错误和缺陷。 经常运行单元测试&#xff0c;确保代码正常运行。…

.net开源框架简介和通用技术选型建议

.net体系 .net core .net 类库 asp.net mvc asp.net webapi asp.net core EF 跨平台和运行时解决方案&#xff08;解决方案&#xff09; Katana&#xff1a;微软基于OWIN规范实现的非IIS寄宿ASP.NET和MVC等。 MONO.NET&#xff1a;跨平台的.NET运行环境&#xff0c;让.NE…

JAVA 2048源码_java实现2048游戏源代码

本文实例为大家分享了java实现2048游戏源代码&#xff0c;供大家参考&#xff0c;具体内容如下一.主要功能&#xff1a;1、游戏初始化&#xff1a;新建游戏44的16宫格画布&#xff0c;随机格子上生成2或者4两个数字2、格子的移动&#xff1a;先判断能否移动&#xff0c;移动后判…

开源干货!.NET Core + Vue.js通用动态权限(RBAC)管理系统框架[DncZeus]开源

DncZeus 前言 关于 DncZeus DncZeus Dnc Zeus "Dnc"--.Net Core 的缩写&#xff1b; "Zeus"--中文译为宙斯&#xff0c;是古希腊神话中的众神之王&#xff0c;奥林匹斯十二主神之首&#xff0c;统治宇宙万物的至高无上的主神&#xff08;在古希腊神…

十大开源的.NET用户界面框架 让GUI设计不再犯难

选择一款合适的GUI框架是.NET开发中比较重要但又很棘手的问题&#xff0c;因为用户界面相当于一款应用的"门面"&#xff0c;直接面向用户。好的UI更能吸引用户&#xff0c;有时甚至成为决定一款应用成败的关键。下面小编整理出十大应用最广泛.NET开源用户界面框架&am…

python flv转mp4_ffmpeg将多个flv文件合成为mp4(python版)

需求直播生成的flv片段需要做个归档&#xff0c;把指定的文件夹中的flv合并成一个mp4&#xff0c;简单的转码合并操作直接用命令行调用来实现。注意事项flv文件直接合并生成mp4的话只有第一个flv的内容才能播放&#xff0c;需要先转换成ts再合成mp4使用的第三方库ffmpy&#xf…

多租户技术

本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。 多租户技术&#xff08;英语&#xff1a;multi-tenancy technology&#xff09;或称多重租赁技术&#xff0c;是一种软件架构技术&#xff0c;它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件&…

使用开源工具ELK可视化 Azure NSG日志

国内的Azure最近上线了网络观察程序服务&#xff0c;可以帮助用户监控和分析VNET虚拟网络。其中一个很重要的功能就是可以记录NSG的安全访问日志了。但是如果用户设置了NSG流日志&#xff0c;并下载日志想要分析一下的话&#xff0c;会发现日志其实并不是很友好&#xff0c;NSG…

pythoncad二次开发视频_AutoCAD ObjectARX 二次开发(2020版)--4,使用ARX向导创建CAD二次开发项目(编程框架)--...

手动创建ObjectARX应用程序非常麻烦&#xff0c;在此步骤中&#xff0c;将介绍ObjectARX向导。在这里&#xff0c;我们将使用ObjectARX向导创建我们的ObjectARX应用程序。本节的程序的需求是&#xff0c;接收CAD用户的输入。首先&#xff0c;打开VS2017&#xff0c;新建项目在左…

Azure Data Explorer(Kusto)学习笔记

Azure Data Explorer 指南 Azure在2018年推出了Data Explorer产品&#xff0c;提供实时海量流数据的分析服务&#xff08;非流计算&#xff09;&#xff0c;面向应用、网站、移动端等设备。 用户可以查询&#xff0c;并交互式地对结果进行分析&#xff0c;以达到提升产品、增…

python将一列数据转换成向量_python读取csv和txt数据转换成向量的实例

最近写程序需要从文件中读取数据&#xff0c;并把读取的数据转换成向量。查阅资料之后找到了读取csv文件和txt文件两种方式&#xff0c;下面结合自己的实验过程&#xff0c;做简要记录&#xff0c;供大家参考&#xff1a;1、读取csv文件的数据import csvfiltpath "data_t…

Iaas,Paas,Saas三者的区别联系是什么?

本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。 多租户技术&#xff08;英语&#xff1a;multi-tenancy technology&#xff09;或称多重租赁技术&#xff0c;是一种软件架构技术&#xff0c;它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件&…

什么是ASP.NET Boilerplate Project(ABP)框架

使用.NET技术进行开发已经多年&#xff0c;偶尔一次网络上搜索.NET开发框架&#xff0c;看到了ABP这个框架&#xff0c;引起了我极大的兴趣&#xff0c;于是决定对该框架进行深入学习和研究&#xff0c;并将过程全部记录如下&#xff0c;对自己也是一次学习和总结&#xff0c;同…

使用ABP打造SAAS系统(2)——前端框架选择

一、流行框架比较 作者用过的前端框架不少&#xff0c;曾经还在一个项目中同时使用两套框架控件&#xff08;年少无知、效率特慢&#xff09;&#xff0c;所以可供选择的前端框架有不少&#xff1a; easyui&#xff1a; 优点&#xff1a;非常成熟的框架&#xff0c;基于iframe…

java 一元线性回归_一元线性回归的java实现

我们有两组数据&#xff0c;比如连续5年的pv与uv。我们想预测一下&#xff0c;uv达到500k那么pv会是多少。当然更有意思可能是&#xff0c;如果销售额是500w的话&#xff0c;pv会是多少。机器学习里的一元线性回归方法是比较简单的方法,就是我们猜是满足ywxb的。那么&#xff0…

【转】ELK是什么能做什么怎么做

作者&#xff1a;蛙课网 链接&#xff1a;https://www.zhihu.com/question/338932215/answer/777380560 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 为什么用到ELK&#xff1a; 一般我们需要进行日志分析场景&…

java中的并发类_java中并发常用工具类

前言:在你无聊的时候,想想比你优秀还努力的人,也许就不觉的无聊了今天下午没事干把买的java并发编程艺术这本书拿出来看了看,看了下也记不住,还是好记性不如烂笔头,今天讲四个并发中可能会用到的工具类,分别是&#xff1a;CountDownLatchCyclicBarrierSemaphoreExchangerCountD…