关于ssm:基于SSM-SpringBoot-vue个人博客网站

<article class=“article fmt article-content”><h3>基于SSM SpringBoot vue集体博客网站</h3><h3>零碎性能</h3><p>首页 图片轮播 博客文章 搜寻 登录注册 论坛 留言板 集体核心 我的珍藏</p><p>后盾治理 登录 集体核心 博客分类管理 博客文章治理 论坛治理 <br/>系统管理 管理员治理 注册用户治理</p><h3>开发环境和技术</h3><ul><li>开发语言:Java</li><li>应用框架: SSM(Spring + SpringMVC + Mybaits)或SpringBoot + Mybaits</li><li>前端: vue</li><li>数据库:Mysql</li><li>架构:B/S</li><li>源码类型: Web</li><li>编译开发工具:Idea、Eclipse、MyEclipse (选其一)</li><li>其余:jdk1.8</li></ul><h3>性能图片展现</h3><p><br/><br/><br/><br/><br/></p><h3>总结</h3><p><strong>源码获取:</strong></p><p>大家可<strong>点赞、珍藏、关注、评论、私信</strong></p></article>

March 4, 2024 · 1 min · jiezi

关于ssm:基于SSM-SpringBoot-vue服装物流管理系统

<article class=“article fmt article-content”><h3>基于SSM SpringBoot vue服装物流管理系统</h3><h3>零碎性能</h3><p>首页 图片轮播 人个核心 登录注册</p><p>后盾治理: 登录注册 集体核心 货物信息管理 货物入库治理 订单信息管理<br/>商品出库治理 快递追踪治理 用户治理 供应商信息管理 盘点信息管理 管理员治理</p><h3>开发环境和技术</h3><ul><li>开发语言:Java</li><li>应用框架: SSM(Spring + SpringMVC + Mybaits)或SpringBoot + Mybaits</li><li>前端: vue</li><li>数据库:Mysql</li><li>架构:B/S</li><li>源码类型: Web</li><li>编译开发工具:Idea、Eclipse、MyEclipse (选其一)</li><li>其余:jdk1.8</li></ul><h3>性能图片展现</h3><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><h3>总结</h3><p><strong>源码获取:</strong></p><p>大家可<strong>点赞、珍藏、关注、评论、私信</strong></p></article>

February 29, 2024 · 1 min · jiezi

关于ssm:基于SSM-SpringBoot-vue物流配送人员管理系统

<article class=“article fmt article-content”><h3>基于SSM SpringBoot vue物流配送人员管理系统</h3><h3>零碎性能</h3><p>登录注册 集体核心 员工治理 考勤信息管理 小区信息管理 打卡信息管理<br/>缺勤统计治理 派单信息管理 工资结算治理 工作统计治理</p><h3>开发环境和技术</h3><ul><li>开发语言:Java</li><li>应用框架: SSM(Spring + SpringMVC + Mybaits)或SpringBoot + Mybaits</li><li>前端: vue</li><li>数据库:Mysql</li><li>架构:B/S</li><li>源码类型: Web</li><li>编译开发工具:Idea、Eclipse、MyEclipse (选其一)</li><li>其余:jdk1.8</li></ul><h3>性能图片展现</h3><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><h3>总结</h3><p><strong>源码获取:</strong></p><p>大家可<strong>点赞、珍藏、关注、评论、私信</strong></p></article>

February 29, 2024 · 1 min · jiezi

关于ssm:SSM-SpringBoot-vue物资管理系统

February 27, 2024 · 0 min · jiezi

关于ssm:SSM-jsp众筹平台

SSM jsp众筹平台零碎性能首页 登录注册 图片轮播 新闻布告 众筹资讯 网站布告 众筹我的项目 发动众筹  在线留言 对于咱们 合作伙伴 后盾治理首页 零碎用户治理 新闻数据管理 零碎简介设置 用户注册治理 留言治理 友情链接治理 图片轮播治理 我的项目分类管理 众筹项目管理 立刻反对治理  开发环境开发语言:Java应用框架: SSM(Spring + SpringMVC + Mybaits)前端: jsp数据库:MySQL (Navicat可视化工具)架构:B/S源码类型: Web编译开发工具:Idea、Eclipse、MyEclipse (选其一) ### 总结 源码获取: 大家可点赞、珍藏、关注、评论、私信

March 15, 2023 · 1 min · jiezi

关于ssm:SSM-SpringBoot-vue餐饮安全与卫生防御管理系统

SSM SpringBoot vue餐饮平安与卫生进攻管理系统登录 首页 集体核心 学生信息管理 学工部人员治理 后勤部人员治理 食品衰弱宣传治理 职业道德技能治理 食堂信息管理 食品采集治理 厨余垃圾回收治理 消毒设施治理  食品安全资讯治理 食堂评估治理 所列性能残缺 应用技术: SSM(Spring + SpringMVC + Mybaits)或SpringBoot + Mysql + vue(前端)

March 10, 2023 · 1 min · jiezi

关于ssm:SSM-SpringBoot-vue药店管理系统

SSM SpringBoot vue药店管理系统登录 首页 一般管理员治理 用户信息管理 会员信息管理 生产厂商治理 类别信息管理 药品信息管理 进货治理 销售信息管理 分割咱们治理 系统管理 所列性能残缺 应用技术: SSM(Spring + SpringMVC + Mybaits)或SpringBoot + Mysql + vue(前端)  

March 8, 2023 · 1 min · jiezi

关于ssm:SSM-jsp商品生产流通系统

SSM jsp商品生产流通零碎首页登录注册 商品列表 商品详情 扫码查看 生产环节 环节步骤 人个材料 后盾治理 用户治理 商品治理 商品类型治理 质检治理 生产治理 环节治理 人个核心 应用技术: SSM(Spring + SpringMVC + Mybaits) + Mysql + jsp(前端) 基于二维码标识商品生产流通全环节追溯零碎的设计与实现

March 7, 2023 · 1 min · jiezi

关于ssm:SSM-jsp人力资源管理系统

SSM jsp人力资源管理系统登录 系统管理 部门治理 员工治理 薪资治理 招聘治理 培训治理 分页列表展现 搜寻 新增 编辑 删除 零碎介绍:权限分为管理员和普通员工 普通员工仅能够看本人的工资,本人的信息。仅能够编辑本人的信息,能够看到部门信息,员工账号不可更改。 管理员能够创立用户,删除用户,编辑用户。能够看到所有人的薪资,编写招聘信息,培训信息等。 所列性能残缺 应用技术: SSM(Spring + SpringMVC + Mybaits) + Spring Security + Mysql + jsp(前端) + BootStrap

February 27, 2023 · 1 min · jiezi

关于ssm:SSM-SpringBoot-vue高校实训管理系统

SSM SpringBoot vue高校实训管理系统首页 图片轮播 布告资讯 课程信息 投票信息 集体核心 登录  后盾治理性能: 登录 集体核心 批改明码 学生信息管理 院系老师治理 实训老师治理 布告资讯治理 系统管理 交换信息管理 实训调配治理 课程信息管理 考勤信息管理 问题信息管理 投票信息管理 投票治理 实训班问题治理 实训满意度治理 所列性能残缺 应用技术: SSM(Spring + SpringMVC + Mybaits)或SpringBoot + Mysql + html(首页) + vue(后盾治理)  

January 19, 2023 · 1 min · jiezi

关于ssm:SSM整合

1、创立Model2、导入依赖<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xiaoan</groupId> <artifactId>ssm</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>ssm Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <spring.version>5.3.1</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <!--springmvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- Mybatis外围 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!--mybatis和spring的整合包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <!-- 连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.9</version> </dependency> <!-- junit测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <!-- log4j日志 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.0</version> </dependency> <!-- 日志 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!-- ServletAPI --> <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.12.1</version> </dependency> <!--文件上传依赖--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <!-- Spring5和Thymeleaf整合包 --> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.0.12.RELEASE</version> </dependency> </dependencies> <build> <finalName>ssm</finalName> </build></project>3、创立表CREATE TABLE `t_emp` ( `emp_id` int(11) NOT NULL AUTO_INCREMENT, `emp_name` varchar(20) DEFAULT NULL, `age` int(11) DEFAULT NULL, `sex` char(1) DEFAULT NULL, `email` varchar(50) DEFAULT NULL, PRIMARY KEY (`emp_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;4、配置web.xml<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app> <!--1、配置Spring的编码过滤器--> <filter> <filter-name>CharacterEncodingFilter</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> <!--初始化响应自定义字符集编码--> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--2、配置解决申请形式PUT和DELETE的过滤器--> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--3、配置SpringMVC的前端控制器--> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--设置SpringMVC的配置文件的地位和名称--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:SpringMVC.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--4、设置Spring的配置文件的地位和名称--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:Spring.xml</param-value> </context-param> <!--5、配置Spring的监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener></web-app>5、创立SpringMVC的配置文件并配置<?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" xmlns:mvc="http://www.springframework.org/schema/mvc" 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/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"> <!--扫描管制层组件--> <context:component-scan base-package="com.xiaoan.controller"></context:component-scan> <!--配置视图解析器--> <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"> <property name="order" value="1"/> <property name="characterEncoding" value="UTF-8"/> <property name="templateEngine"> <bean class="org.thymeleaf.spring5.SpringTemplateEngine"> <property name="templateResolver"> <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"> <!-- 视图前缀 --> <property name="prefix" value="/WEB-INF/templates/"/> <!-- 视图后缀 --> <property name="suffix" value=".html"/> <property name="templateMode" value="HTML5"/> <property name="characterEncoding" value="UTF-8" /> </bean> </property> </bean> </property> </bean> <!--配置拜访首页的视图管制--> <mvc:view-controller path="/" view-name="index"></mvc:view-controller> <!--配置默认的servlet解决动态资源--> <mvc:default-servlet-handler/> <!--开启MVC的注解驱动--> <mvc:annotation-driven/> <!--配置文件上传解析器--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> <!--异样处理器--> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"/></beans>6、创立Spring的配置文件并配置<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--扫描组件(除管制层) --> <context:component-scan base-package="com.xiaoan"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--引入jdbc.properties--> <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder> <!--配置Druid数据源--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <!--配置用于创立SqlSessionFactory的工厂Bean--> <bean class="org.mybatis.spring.SqlSessionFactoryBean"> <!--设置MyBatits外围配置文件的门路--> <property name="configLocation" value="classpath:mybatis-config.xml"></property> <!--设置数据源--> <property name="dataSource" ref="dataSource"></property> <!--设置类型别名所对应的包--> <property name="typeAliasesPackage" value="com.xiaoan.pojo"></property> <!-- 设置映射文件的门路 若映射文件所在门路和mapper接口所在门路统一,则不须要设置 --><!-- <property name="mapperLocations" value="classpath:mappers/*.xml"></property>--> </bean> <!-- 配置mapper接口的扫描配置 由mybatis-spring提供,能够将指定包下所有的mapper接口创立动静代理 并将这些动静代理作为IOC容器的bean治理 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.xiaoan.mapper"></property> </bean></beans>7、搭建MyBatis环境7.1 创立属性文件jdbc.propertiesjdbc.username=rootjdbc.password=rootjdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTCjdbc.driver=com.mysql.cj.jdbc.Driver7.2 创立Mybatis外围配置文件mybatis-config.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <!-- Mybatis外围配置文件中标签程序: 从前到后: properties?,settings?,typeAliases?, typeHandlers?,objectFactory?, objectWrapperFactory?,reflectorFactory?, plugins?,environments?,databaseIdProvider?, mappers? --> <settings> <!--将下划线映射为驼峰命名--> <setting name="mapUnderscoreToCamelCase" value="true"/> <!--开启提早加载--> <setting name="lazyLoadingEnabled" value="true"/> <!--是否开启残缺加载 false 按需加载--> <setting name="aggressiveLazyLoading" value="false"/> </settings></configuration>7.3 创立Mapper接口和映射文件mapper接口public interface EmployeeMapper {List<Employee> getEmployeeList();}映射文件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.atguigu.ssm.mapper.EmployeeMapper"> <select id="getEmployeeList" resultType="Employee"> select * from t_emp </select></mapper>7.4 创立日志文件log4j.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <param name="Encoding" value="UTF-8" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" /> </layout> </appender> <logger name="java.sql"> <level value="debug" /> </logger> <logger name="org.apache.ibatis"> <level value="info" /> </logger> <root> <level value="debug" /> <appender-ref ref="STDOUT" /> </root></log4j:configuration>

January 8, 2023 · 3 min · jiezi

关于ssm:微体系多端全栈项目实战商业级代驾全流程落地超清无密网盘

download:【微体系】多端全栈我的项目实战:商业级代驾全流程落地再次意识 WebAssembly简略地说,Wasm 是一个编译指标,能够应用大概 30 种语言编写的代码,应用特定于 WebAssembly 的工具来编译它,将其编译为 .wasm 文件,目前最风行的针对 Wasm 的语言是 C、C++ 和 Rust(即因为它们本人治理内存并且不须要垃圾收集器)。对 Go、Python 和 JavaScript 生态系统的反对也在快速增长。编译生成的.wasm 文件能够在浏览器或服务器上。Wasm 文件蕴含虚拟机能够读取的二进制指令,并且因为 Wasm 以虚拟机为指标,因而它实用于许多芯片架构,它以风行硬件的最小公分母为指标,堆栈机,这是它区别于其余产生二进制代码的指标的中央。Wasm 最后是为浏览器构建的,然而随着技术的成熟,在服务器端看到了越来越多的用例。本文再次介绍 WebAssembly 的劣势及利用场景,并通过示例意识其我的项目开发的过程,点击查看代码。 领有什么劣势Wasm 容许应用相熟的语言编写代码并在任何中央运行它。 更快的启动工夫在服务器上,Wasm 能够实现比 Docker 容器快 10-100 倍的冷启动工夫,因为它不须要为每个容器创立一个 OS 过程。在浏览器中,解码 Wasm 比解析、解释和优化 JavaScript 更快,因而 Wasm 代码在浏览器中的执行速度比 JavaScript 更快。 近乎原生的性能对于 Wasm 的性能细节存在一些争议,但它的劣势在于容许用户将其应用程序的计算密集型局部封装到较低级别的语言。 Wasm 的许多性能劣势来自于它(它是 Wasm 代码)被构建为尽可能靠近本机机器代码这一事实。 轻量级Wasm 二进制文件体积小,因而只应用大量带宽,通常比浏览器中的穿插编译 JavaScript 破费更少的工夫通过网络传输。便捷通用任何 Wasm 运行时都能够运行任何 Wasm 代码(只管并非所有运行时都反对所有 Wasm 扩大,即不同的 WASI 接口类型)。大多数浏览器都反对 WebAssembly,并且在服务器端(WasmEdge、Wasmtime 等)有许多运行 Wasm 代码的运行时。鉴于浏览器和服务器(以及硬件)对 Wasm 的广泛支持,它是具备可移植的,并且也十分通用,大概 30 种语言能够编译或在其中执行(C、C++、Rust、Python、Go、AssemblyScript、JavaScript等等)。 ...

June 24, 2022 · 2 min · jiezi

关于ssm:ssm-多数据源

1th xml配置<bean name="dataSource_jeecg" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">略<bean> <!-- 数据源汇合 --> <bean id="dataSource" class="org.jeecgframework.core.extend.datasource.DynamicDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <!----> <entry key="push" value-ref="dataSource_jeecg" /> <!----> <entry key="defau" value-ref="mapdataSource" /> </map> </property> <!--默认数据源--> <property name="defaultTargetDataSource" ref="dataSource_jeecg" /> </bean>2th, java配置类public class DynamicDataSourceGlobal { public static final String DATASOURCE_PUSH="defaut"; // 企业数据库 public static final String DATASOURCE_DEFAU="defaut02";// 海关数据库}-- 设置类public class DynamicDataSourceHolder { // 线程本地环境 @SuppressWarnings("rawtypes") private static final ThreadLocal contextHolder = new ThreadLocal(); // 设置数据源类型 @SuppressWarnings("unchecked") public static void setDataSourceType(String dataSourceType) { contextHolder.set(dataSourceType); } // 获取数据源类型 public static String getDataSourceType() { return (String) contextHolder.get(); } // 革除数据源类型 public static void clearDataSourceType() { contextHolder.remove(); }}3th service 调用DynamicDataSourceHolder.setDataSourceType(DynamicDataSourceGlobal.DATASOURCE_PUSH);jdbcTemplate.queryForList(sql);具体的业务或则读写拆散应用 ...

June 20, 2022 · 1 min · jiezi

关于ssm:SSM框架

一、Spring 1.IoC入门案例 2.DI入门案例 3.Bean配置 4.Bean生命周期 5.依赖注入形式

April 22, 2022 · 1 min · jiezi

关于ssm:SSM项目踩坑-前端请求获取不了分页内容

author: Nathanniedate: 2022-04-16-22:58 问题背景学习SSM我的项目,指标是点击前端店铺二级分类按钮,获取此分类对应shopCategoryId下的所有店铺信息列表,但点击无果,始终停留在期待刷新页面,解决甚久,破费一下午。 报错信息报错截图: 问题剖析始终期待刷新,猜测获取不到数据,借此机会,决定从头到尾的钻研一下此性能的实现过程,最初发现的确是获取不到数据,但不是没有数据,而是获取形式谬误。此分类下的内容须要分页展现(以动静刷新的形式),设置分页逻辑代码编写谬误,使得获取的数据的索引(Index)超过实在数据(index)范畴。 回顾分页逻辑: rowIndex = (PageIndex-1) x PageSize即示意按所需分页页数和分页单页数据个数失去的某页的首个数据项所在的索引地位。艰深来说,依照每页PageSize个数据项,获取第PageIndex页的第一个数据项的索引地位示意。图示: ⚠️留神: 页数是依照,1,2,3..的逻辑开始,而行数(索引)是依照0,1,2,3...的逻辑开始,所以索引为0的行,事实中的了解逻辑为第1行,索引为3的行,事实了解逻辑为第4行。上述图的索引为5的行,事实逻辑就为第6行。 上述算法能够由 RowIndex,pageSize失去PageIndex(第几页),由PageSize,PageIndex失去PageIndex页的首行数据项索引(在所有数据中占第几行)。 问题解决次要起因是转化算法,参数写错了谬误的代码: // 将pageIndex转为rowIndexint rowIndex = PageCalculator.calculateRowIndex(pageIndex, pageSize);// 调用办法获取shopList,countList<Shop> shopList = shopDao.queryShopList(shopCondition, PageIndex, pageSize); ↑ 这里应该是计算后的rowIndex 正确的代码: // 将pageIndex转为rowIndex int rowIndex = PageCalculator.calculateRowIndex(pageIndex, pageSize);// 调用办法获取shopList,count List<Shop> shopList = shopDao.queryShopList(shopCondition, rowIndex, pageSize);上述pageIndex,pageSize是前端传递的参数,这里为1,3。 通过上述剖析,理论数据库中数据只有一条:依照错误代码的查问形式,则是“从第2行数据开始,查问3条数据”显然是没有的(没有第二行,也没有三个数据) 查问代码: SELECT s.shop_id, s.shop_name, s.shop_desc, s.shop_addr, s.phone , s.shop_img, s.priority, s.create_time, s.last_edit_time, s.enable_status , s.advice, a.area_id, a.area_name, sc.shop_category_id, sc.shop_category_nameFROM tb_shop s, tb_area a, tb_shop_category scWHERE s.shop_category_id = 22 AND s.shop_category_id IN ( SELECT shop_category_id FROM tb_shop_category WHERE parent_id = 12 ) AND s.shop_category_id = sc.shop_category_id AND s.area_id = a.area_idORDER BY s.priority DESC-- LIMIT 1,3LIMIT 0, 3LIMIT 0, 3这才是正确的分页参数。依照LIMIT 1,3这个形式天然查不出数据。 ...

April 16, 2022 · 1 min · jiezi

关于ssm:超全的SSM三大框架整合教程SpringSpringMVCMyBatis

这次 , 说说 三大框架整合过程 。集体认为应用框架并不是很难,要害要了解其思维,这对于咱们进步编程程度很有帮忙。不过,如果用都不会,谈思维就变成夸夸其谈了!!! 先技术,再思维。实际出真知。上面就一起学习!!! 无关SSM整合不懂得能够观看此视频教程:https://www.bilibili.com/video/BV1Ug4y1i7W7 一、基本概念1、Spring Spring 是一个开源框架, Spring 是于 2003 年衰亡的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著述 Expert One-On-One J2EE Development and Design 中论述的局部理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创立的。 Spring 应用根本的 JavaBean 来实现以前只可能由 EJB 实现的事件。然而, Spring 的用处不仅限于服务器端的开发。从简略性、可测试性和松耦合的角度而言,任何 Java 利用都能够从 Spring 中受害。 简略来说, Spring 是一个轻量级的管制反转( IoC )和面向切面( AOP )的容器框架。 2、SpringMVC Spring MVC 属于 SpringFrameWork 的后续产品,曾经交融在 Spring Web Flow 外面。 Spring MVC 拆散了控制器、模型对象、分派器以及处理程序对象的角色,这种拆散让它们更容易进行定制。 3、MyBatis MyBatis 本是 apache的一个开源我的项目iBatis, 2010 年这个我的项目由 apache software foundation 迁徙到了 google code ,并且改名为 MyBatis 。 MyBatis 是一个基于Java 的长久层框架。 iBATIS 提供的长久层框架包含 SQL Maps 和 Data Access Objects ( DAO ) MyBatis 打消了简直所有的 JDBC 代码和参数的手工设置以及后果集的检索。 MyBatis 应用简略的 XML 或注解用于配置和原始映射,将接口和 Java 的POJOs ( Plain Old Java Objects ,一般的 Java 对象)映射成数据库中的记录。 ...

March 25, 2022 · 5 min · jiezi

关于ssm:ssm整合2

1.创立maven我的项目,补全java,resources目录2.在pom.xml中引入依赖搭建spring环境3.编写spring的配置文件(applicationContext.xml) 内容:指明要扫描的包(dao,service),将其实例化并存储在IOC容器中???domain包扫描没有搭建SpringMVC环境1.在web.xml中配置前端控制器2.配置springmvc.xml 内容:1.要扫描的包:controller2.视图解析器3.开启注解反对整合spring和springmvc1.在web.xml中配置监听器 作用:在创立ServletContext的同时扫描applicationContext.xml2.在controller类中注入service类整合mybatis 在applicationContext.xml中对数据库进行配置1.配置c3p0连接池对象2.配置SqlSession工厂3.配置要扫描的包4.在dao接口中增加@Repository注解,用注解的形式给dao的办法增加sql语句5.在service中注入dao的代理对象

April 25, 2021 · 1 min · jiezi

关于ssm:SSMSpringmvc

springmvc概述Springmvc是spring框架的一个模块,spring和springmvc无需两头整合层整合。Springmvc是一个基于mvc的web框架 体现层的三大工作: URL到controller的映射http申请参数绑定http响应的生成和输入MVC设计模式MVC设计模式是一种通用的软件编程思维。在MVC设计模式中认为, 任何软件都能够分为三局部组成:(1)控制程序流转的控制器(Controller)(2)封装数据解决数据的模型(Model)(3)负责展现数据的视图(view) springmvc的实现原理(1) .用户发送申请 至 前端控制器(DispatcherServlet);提醒:DispatcherServlet的作用:接管申请,调用其它组件解决申请,响应结 果,相当于转发器、中央处理器,是整个流程管制的核心 (2) .前端控制器(DispatcherServlet)收到申请后调用处理器映射器 (HandlerMapping)处理器映射器(HandlerMapping)找到具体的Controller(能够依据xml配置、注解进 行查找),并将Controller返回给DispatcherServlet; (3) .前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)。解决 器适配器通过适配调用具体的Controller;(Controller--> service --> Dao --> 数据库)Controller执行实现后返回ModelAndView,提醒:Model(模型数据,即Controller解决的后果,Map) View(逻辑视图名,即 负责展现后果的JSP页面的名字)处理器适配器(HandlerAdapter)将controller执行的后果(ModelAndView)返回给前 端控制器(DispatcherServlet); (4) .前端控制器(DispatcherServlet)将执行的后果(ModelAndView)传给视图解析 器(ViewReslover)视图解析器(ViewReslover)依据View(逻辑视图名)解析后返回具体JSP页面 (5) .前端控制器(DispatcherServlet)依据Model对View进行渲染(行将模型数据 填充至视图中);前端控制器(DispatcherServlet)将填充了数据的网页响应给用户 springmvc实现第一步:创立maven我的项目springmvc第二步:在pom文件中增加依赖 <dependencies> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <!-- SpringMVC的jar包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.1.3.RELEASE</version> </dependency> <!-- servlet 和 jsp的jar包 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <!-- java对象转换json的工具类 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.1</version> </dependency> --></dependencies>第三步:web.xml中配置前端控制器 ...

November 28, 2020 · 2 min · jiezi

关于ssm:喜大普奔华为架构师终于整理出SSMNginxRedisSQL微服务pdf

SSM第1局部入门和技术根底 第1章意识SSM框架和Redis 第2章Java设计模式 第2局部互联网长久框架- -MyBatis 第3章意识MyBatis外围组件 第4章MyBatis配置 第5章映射器 第6章动静SQL 第7章MyBatis的解析和运行原理 第8章插件 第3局部Spring根底 第9章Spring IoC的概念 第10章拆卸Spring Bean 第11章面向切面编程 第12章Spring和数据库编程 第13章深刻Spring数据库事务管理 第4局部Spring MVC框架 第14章Spring MVC的初始化和流程 第15章深刻Spring MVC组件开发 第16章Spring MVC高级利用 第5局部Redis利用 第17章Redis概述 第18章Redis数据结构常用命令 第19章Redis的一些罕用技术 第20章Redis配置 第21章Spring缓存机制和Redis的联合 第6局部SSM框架+ Redis实际利用 第22章高并发业务 附录A数据库表模型 附录B DispatcherServlet流程源码剖析 附录C JSTL罕用标签 附录D spring data redis项目分析 这些大火的PDF我曾经为大家整顿好了,SSM+微服务+Nginx+Redis+MySQL,须要支付的敌人点赞这篇文章+私信我【架构书籍】即可。知乎:秃顶之路 b站:linux亦有归途 每天都会更新咱们的公开课录播以及编程干货和大厂面经也能够间接点击c/c++ linux服务器开发高级架构师来课堂上跟咱们讲师面对面交换 微服务微服务介绍 模块拆分 Spring Boot Dubbo Spring Cloud 数据长久化 表单验证 定时工作 分布式会话 音讯队列 构建Web利用 异样解决 平安认证 ...

November 2, 2020 · 1 min · jiezi

关于ssm:第六阶段-第四模块

October 9, 2020 · 0 min · jiezi

关于ssm:SSM框架下实现权限管理附源码

具体思路:配置三张表,别离是角色表,权限表和角色权限对应表。后端配置一个全局拦截器,在拦挡每一次申请时,去查表里该用户对应的角色权限是否存在,如果存在就通过,不存在就回绝并提醒。一. 设计数据库表构造角色表 权限表 角色权限对应表 二. 配置全局拦截器AllInterceptor.java public class AllInterceptor implements HandlerInterceptor { /** * 角色对应权限表的service */ @Autowired private MenuService menuService; /** * 权限表的service */ @Autowired private UrlService urlService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 失去申请地址 String url = request.getRequestURI(); HttpSession session = request.getSession(); String projectName = "/CustomerSystem"; // 去除申请前缀文件名 (能够去也能够不去,看你次要的申请长什么样和权限表里存的地址) url = url.substring(projectName.length(), url.length()); url_info uInfo = this.urlService.selectUrl(url); if(uInfo != null){ menu_info mInfo = new menu_info(); mInfo.setType(Integer.parseInt((String)session.getAttribute("type")) + 1); mInfo.setUrlId(uInfo.getId()); int a = this.menuService.selectMenu(mInfo); // 有该权限间接通过 if(a > 0){ return true; } // 没有该权限就提醒并跳转到登录页面 session.setAttribute("msg", "<script type='text/javascript'>alert('道歉,您尚未有此性能权限!')</script>"); request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); return false; } // 查不到此地址,间接返回提醒并跳转到登录页面 session.setAttribute("msg", "<script type='text/javascript'>alert('道歉,您尚未有此性能权限!')</script>"); request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView model) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }在springMVC配置文件里申明这个全局拦截器 ...

August 25, 2020 · 1 min · jiezi

关于ssm:SSM框架环境搭建

SSM-CRUD根底环境搭建创立maven工程 next,finish,期待创立实现,创立实现后,src/main下只有webapp文件夹,咱们须要手动创立java和resources,鼠标右击main,new folder,将java改成Sources类型,resources变成Resources类型 引入我的项目依赖springspringmvcmybatis数据库连接池,驱动其它(jstl,servlet-api,junit)编写ssm整合的配置文件web.xml增加束缚 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> </web-app>配置spring,springmvc,字符过滤器,Restful URI <!--1、启动spring容器--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--2、配置springMvc的前端控制器 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 3、字符编码过滤器,肯定要放在所有过滤器之前 --> <filter> <filter-name>CharacterEncodingFilter</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> <init-param> <param-name>forceRequestEncoding</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 4、应用Rest格调的URI,将页面一般的post申请转为指定的delete或者put申请 --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>HttpPutFormContentFilter</filter-name> <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class> </filter> <filter-mapping> <filter-name>HttpPutFormContentFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>springmvc配置文件<?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" 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"> <!--SpringMVC的配置文件,蕴含网站跳转逻辑的管制,配置--> <context:component-scan base-package="com.yu" use-default-filters="false"> <!--只扫描控制器--> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--配置视图解析器,不便页面返回 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> <!--两个标准配置 --> <!-- 将springmvc不能解决的申请交给tomcat --> <mvc:default-servlet-handler/> <!-- 能反对springmvc更高级的一些性能,JSR303校验,快捷的ajax...映射动静申请 --> <mvc:annotation-driven/></beans>spring配置文件<?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" xmlns:tx="http://www.springframework.org/schema/tx" 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/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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="com.yu"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!--spring配置文件,这里次要配置和业务逻辑无关的--> <!--=================== 数据源,事务管制,xxx ================--> <context:property-placeholder location="classpath:dbconfig.properties" /> <bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="user" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--整合mybatis--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定mybatis全局配置文件的地位 --> <property name="configLocation" value="classpath:mybatis-config.xml"></property> <property name="dataSource" ref="pooledDataSource"></property> <!-- 指定mybatis,mapper文件的地位 --> <property name="mapperLocations" value="classpath:mapper/*.xml"></property> </bean> <!-- 配置扫描器,将mybatis接口的实现退出到ioc容器中 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--扫描所有dao接口的实现,退出到ioc容器中 --> <property name="basePackage" value="com.yu.crud.dao"></property> </bean> <!-- 配置一个能够执行批量的sqlSession --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg> <constructor-arg name="executorType" value="BATCH"></constructor-arg> </bean> <!--============================================= --> <!-- ===============事务管制的配置 ================--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--管制住数据源 --> <property name="dataSource" ref="pooledDataSource"></property> </bean> <!--开启基于注解的事务,应用xml配置模式的事务(必要次要的都是应用配置式) --> <aop:config> <!-- 切入点表达式 --> <aop:pointcut expression="execution(* com.yu.crud.service..*(..))" id="txPoint"/> <!-- 配置事务加强 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/> </aop:config> <!--配置事务加强,事务如何切入 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 所有办法都是事务办法 --> <tx:method name="*"/> <!--以get开始的所有办法 --> <tx:method name="get*" read-only="true"/> </tx:attributes> </tx:advice> <!-- Spring配置文件的外围点(数据源、与mybatis的整合,事务管制) --></beans>数据源配置文件dbconfig.propertiesjdbc.jdbcUrl=jdbc:mysql://localhost:3306/ssm_crudjdbc.driverClass=com.mysql.jdbc.Driverjdbc.user=rootjdbc.password=123456mybatis配置文件<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> <package name="com.atguigu.crud.bean"/> </typeAliases> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!--分页参数合理化 --> <property name="reasonable" value="true"/> </plugin> </plugins></configuration>应用mybatis的逆向工程生成对应的bean以及mapper在以后我的项目下新建mbg.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressAllComments" value="true" /> </commentGenerator> <!-- 配置数据库连贯 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/ssm_crud" userId="root" password="******"> </jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- 指定javaBean生成的地位 --> <javaModelGenerator targetPackage="com.yu.crud.bean" targetProject=".\src\main\java"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!--指定sql映射文件生成的地位 --> <sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- 指定dao接口生成的地位,mapper接口 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.yu.crud.dao" targetProject=".\src\main\java"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- table指定每个表的生成策略 --> <table tableName="tbl_emp" domainObjectName="Employee"></table> <table tableName="tbl_dept" domainObjectName="Department"></table> </context></generatorConfiguration>在test包下新建MBGTest来逆向生成bean和mapperpublic class MBGTest { public static void main(String[] args) throws Exception { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; File configFile = new File("mbg.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); }}因为员工表寄存的是部门id,所以要想当前查问员工列表的时候显示部门名称又不想执行两次sql,须要增加连表查询方法,在dao下的EmployeeMapper接口下增加两个办法, ...

August 21, 2020 · 3 min · jiezi

手把手整合SSM框架

前言如果看过前几篇文章,对 Spring 和 MyBatis 有了肯定理解,肯定想上手试试。这篇文章从 0 到 1,手把手整合 SSM (Spring、Spring MVC、MyBatis)。本篇是代码篇,在 PC 端浏览更佳,源码在文末[toc] 搭建整合 SSM 之 HelloWorld开发环境ideaMySql5.xjdk8maven对应的技术入门在 公众号 历史文章 都能够找到目录 目录包含 main、resources、mapper、webapp,不一一介绍,不相熟查看后面文章。 环境搭建新建我的项目这里应用的是 IDEA 编辑器,新建一个 Maven 工程,抉择 web 我的项目。 导入依赖应用 Maven 治理我的项目 jar ,只须要在 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>javapub.rodert.github</groupId> <artifactId>ssm_helloword_web</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <url></url><!-- 源码:https://github.com/Rodert/JavaPub--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.3.6.RELEASE</spring.version> </properties> <dependencies> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- 1.日志 --> <!-- 实现slf4j接口并整合 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.1</version> </dependency> <!-- 2.数据库 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.37</version> <scope>runtime</scope> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <!-- DAO: MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.3</version> </dependency> <!-- 3.Servlet web --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.4</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <!-- 4.Spring --> <!-- 1)Spring外围 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- 2)Spring DAO层 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <!-- 3)Spring web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- 4)Spring test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- redis客户端:Jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.0.8</version> </dependency> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-runtime</artifactId> <version>1.0.8</version> </dependency> <!-- Map工具类 --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2</version> </dependency> <!--注解--> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>ssm_helloword_web</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>7</source> <target>7</target> </configuration> </plugin> </plugins> </build></project><!-- 源码:https://github.com/Rodert/JavaPub-->编码配置文件spring-dao.xml先在spring文件夹里新建spring-dao.xml文件,咱们这里分三层,别离是dao service web。加载数据库配置配置数据库连接池配置 SqlSessionFactory 对象(MyBatis)配置扫描 dao 层接口,动静代理实现 Dao 实现类,执行 sql 写在 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/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"> <!-- 配置整合mybatis过程 --> <!-- 1.配置数据库相干参数properties的属性:${url} --> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- 2.数据库连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 配置连接池属性 --> <property name="driverClass" value="${jdbc.driver}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- c3p0连接池的公有属性 --> <property name="maxPoolSize" value="30" /> <property name="minPoolSize" value="10" /> <!-- 敞开连贯后不主动commit --> <property name="autoCommitOnClose" value="false" /> <!-- 获取连贯超时工夫 --> <property name="checkoutTimeout" value="10000" /> <!-- 当获取连贯失败重试次数 --> <property name="acquireRetryAttempts" value="2" /> </bean> <!-- 3.配置SqlSessionFactory对象 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入数据库连接池 --> <property name="dataSource" ref="dataSource" /> <!-- 配置MyBaties全局配置文件:mybatis-config.xml --> <property name="configLocation" value="classpath:Mybatis-config.xml" /> <!-- 扫描entity包 应用别名 --> <property name="typeAliasesPackage" value="javapub.rodert.github.entity" /> <!-- 扫描sql配置文件:mapper须要的xml文件 --> <property name="mapperLocations" value="classpath:mapper/*.xml" /> </bean> <!-- 4.配置扫描Dao接口包,动静实现Dao接口,注入到spring容器中 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 注入sqlSessionFactory --> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> <!-- 给出须要扫描Dao接口包 --> <property name="basePackage" value="javapub.rodert.github.dao" /> </bean></beans>jdbc.properties数据库配置,在 resources 文件夹里新建一个 jdbc.properties 文件,留神本人的明码。 ...

July 12, 2020 · 12 min · jiezi

前后端分离ssm配置swagger接口文档

之前配置过springboot,相比ssm要简单很多,现在记录一下ssm的配置 在pom.xml中加入依赖<!--swagger本身不支持spring mvc的,springfox把swagger包装了一下,让他可以支持springmvc--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.6.1</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.6.1</version> </dependency>添加配置类SwaggerConfig.java@WebAppConfiguration@EnableSwagger2@EnableWebMvc@ComponentScan(basePackages = "com.maxcore.controller")public class SwaggerConfig { @Bean public Docket customDocket() { // return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.any()) .build() .apiInfo(apiInfo()); } private ApiInfo apiInfo() { Contact contact = new Contact("娜", "https://www.baidu.me", "baidu_666@icloud.com"); return new ApiInfo("仿简书前台API接口",//大标题 title "Swagger测试demo",//小标题 "0.0.1",//版本 "www.baidu.com",//termsOfServiceUrl contact,//作者 "Blog",//链接显示文字 "https://www.baidu.me"//网站链接 ); }}在dispatcher-servlet.xml(springmvc的配置文件)中加入如下配置 <bean class="com.maxcore.config.SwaggerConfig" /> <mvc:resources mapping="swagger-ui.html" location="classpath:/META-INF/resources/" /> <mvc:resources mapping="/webjars/**" location="classpath:/META-INF/resources/webjars/" />要在controller层添加注解 最后启动项目,访问swagger接口文档的路径一定要对,不然一直报404,你以为你没配置对,其实是你路径不对,笔者在这里表示有很痛的领悟笔者的本地的访问路径是 http://localhost/jianShuSSM_w... 一般都是http://ip地址:端口(默认80,不显示)/项目名/swagger-ui.html ...

June 22, 2019 · 1 min · jiezi

前后端分离ssm配置跨域

前后端分离开发需要跨域,之前只会pringboot跨域,只需要一个配置类即可,下面记录一下ssm的配置 三个文件需要添加配置 SimpleCORSFilter.java实现Filterpublic class SimpleCORSFilter implements Filter { private boolean isCross = false; @Override public void destroy() { isCross = false; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (isCross) { HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletResponse httpServletResponse = (HttpServletResponse) response; System.out.println("拦截请求: " + httpServletRequest.getServletPath()); httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); httpServletResponse.setHeader("Access-Control-Max-Age", "0"); httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token"); httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true"); httpServletResponse.setHeader("XDomainRequestAllowed", "1"); } chain.doFilter(request, response); } @Override public void init(FilterConfig filterConfig) throws ServletException { String isCrossStr = filterConfig.getInitParameter("IsCross"); isCross = isCrossStr.equals("true") ? true : false; System.out.println(isCrossStr); }dispatcher-servlet.xml(springMVC的配置文件)<!-- 接口跨域配置--> <mvc:cors> <mvc:mapping path="/**" allowed-origins="*" allowed-methods="POST, GET, OPTIONS, DELETE, PUT" allowed-headers="Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With" allow-credentials="true" /> </mvc:cors> ## web.xml ...

June 22, 2019 · 1 min · jiezi

从零开始搭建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”: Next,输入项目的“GroupId”、“ArtifactId”和Version: Next,指定“Maven home directory”等配置: Next,修改Project Name: Finish,打开项目,添加一些必要的目录,最终项目框架目录图如下: 修改pom.xml文件,指定各依赖和插件的版本等信息: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>11</java.version> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <spring.version>5.1.6.RELEASE</spring.version> <junit.version>4.12</junit.version> <lombok.version>1.18.6</lombok.version> <mybatis-plus.version>3.1.1</mybatis-plus.version> <freemarker.version>2.3.28</freemarker.version> <druid.version>1.1.16</druid.version> <jsqlparser.version>2.0</jsqlparser.version> <mysql-connector.version>8.0.16</mysql-connector.version> <jstl-api.version>1.2</jstl-api.version> <servlet-api.version>4.0.1</servlet-api.version> <jsp-api.version>2.3.3</jsp-api.version> <springfox-swagger.version>2.9.2</springfox-swagger.version> <commons-lang3.version>3.9</commons-lang3.version> <jackson.version>2.9.8</jackson.version> <mapstruct.version>1.3.0.Final</mapstruct.version> <log4j.version>2.11.2</log4j.version> <slf4j.version>1.7.26</slf4j.version> <clean.plugin.version>3.1.0</clean.plugin.version> <resources.plugin.version>3.1.0</resources.plugin.version> <compiler.plugin.version>3.8.0</compiler.plugin.version> <surefire.plugin.version>3.0.0-M3</surefire.plugin.version> <war.plugin.version>3.2.2</war.plugin.version> <install.plugin.version>3.0.0-M1</install.plugin.version> <deploy.plugin.version>3.0.0-M1</deploy.plugin.version></properties>在<dependencyManagement>标签里面管理各依赖的版本号: <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>${mybatis-plus.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>${mybatis-plus.version}</version> <scope>test</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>${freemarker.version}</version> <scope>test</scope> <optional>true</optional> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>${jsqlparser.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector.version}</version> </dependency> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>${jstl-api.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet-api.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>${jsp-api.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${springfox-swagger.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${springfox-swagger.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${mapstruct.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>${log4j.version}</version> </dependency> </dependencies></dependencyManagement>添加项目依赖: ...

May 3, 2019 · 8 min · jiezi

SpringBoot 仿抖音短视频小程序开发(三)

SpringBoot 仿抖音短视频小程序开发(一):项目的简介(https://segmentfault.com/a/11...SpringBoot 仿抖音短视频小程序开发(二):项目功能分析与具体实现(https://segmentfault.com/a/11…源代码: SpringBoot 仿抖音短视频小程序开发 全栈式实战项目(https://gitee.com/scau_zns/sh…)短视频后台管理系统:(https://gitee.com/scau_zns/sh…小程序的后台管理系统涉及的技术栈:Bootstrap + jQuery + jGrid + SSM框架 + zookeeper一、用户列表的获取与分页前端代码: <div class=“usersList_wrapper”> <!– 用户列表展示的表格 –> <table id=“usersList”></table> <!– 底部的分页条 –> <div id=“usersListPager”></div> </div> jGrid发送请求获取数据封装好展示到页面// 用户列表 var handleList = function() { // 上下文对象路径 var hdnContextPath = $("#hdnContextPath").val(); var apiServer = $("#apiServer").val(); var jqGrid = $("#usersList"); jqGrid.jqGrid({ caption: “短视频用户列表”, url: hdnContextPath + “/users/list.action”, mtype: “post”, styleUI: ‘Bootstrap’,//设置jqgrid的全局样式为bootstrap样式 datatype: “json”, colNames: [‘ID’, ‘头像’, ‘用户名’, ‘昵称’, ‘粉丝数’, ‘关注数’, ‘获赞数’], colModel: [ { name: ‘id’, index: ‘id’, width: 30, sortable: false, hidden: false }, { name: ‘faceImage’, index: ‘username’, width: 50, sortable: false, formatter:function(cellvalue, options, rowObject) { <!– 配置的虚拟目录apiServer = http://192.168.199.150:8080 –> var src = apiServer + cellvalue; var img = “<img src=’” + src + “’ width=‘120’></img>” return img; } }, { name: ‘username’, index: ‘password’, width: 30, sortable: false }, { name: ’nickname’, index: ’nickname’, width: 30, sortable: false }, { name: ‘fansCounts’, index: ‘age’, width: 20, sortable: false }, { name: ‘followCounts’, index: ‘sexValue’, width: 20, sortable: false }, { name: ‘receiveLikeCounts’, index: ‘province’, width: 20, sortable: false, hidden: false } ], viewrecords: true, // 定义是否要显示总记录数 rowNum: 10, // 在grid上显示记录条数,这个参数是要被传递到后台 rownumbers: true, // 如果为ture则会在表格左边新增一列,显示行顺序号,从1开始递增。此列名为’rn’ autowidth: true, // 如果为ture时,则当表格在首次被创建时会根据父元素比例重新调整表格宽度。如果父元素宽度改变,为了使表格宽度能够自动调整则需要实现函数:setGridWidth height: 500, // 表格高度,可以是数字,像素值或者百分比 rownumWidth: 36, // 如果rownumbers为true,则可以设置行号 的宽度 pager: “#usersListPager”, // 分页控件的id subGrid: false // 是否启用子表格 }).navGrid(’#usersListPager’, { edit: false, add: false, del: false, search: false }); // 随着窗口的变化,设置jqgrid的宽度 $(window).bind(‘resize’, function () { var width = $(’.usersList_wrapper’).width()0.99; jqGrid.setGridWidth(width); }); // 不显示水平滚动条 jqGrid.closest(".ui-jqgrid-bdiv").css({ “overflow-x” : “hidden” }); // 条件查询所有用户列表 $("#searchUserListButton").click(function(){ var searchUsersListForm = $("#searchUserListForm"); jqGrid.jqGrid().setGridParam({ page: 1, url: hdnContextPath + “/users/list.action?” + searchUsersListForm.serialize(), }).trigger(“reloadGrid”); }); }后端获取用户列表分页数据的接口: @PostMapping("/list") @ResponseBody public PagedResult list(Users user , Integer page) { PagedResult result = usersService.queryUsers(user, page == null ? 1 : page, 10); return result; }搜索功能的实现:<!– 搜索内容 –> <div class=“col-md-12”> <br/> <form id=“searchUserListForm” class=“form-inline” method=“post” role=“form”> <div class=“form-group”> <label class=“sr-only” for=“username”>用户名:</label> <input id=“username” name=“username” type=“text” class=“form-control” placeholder=“用户名” /> </div> <div class=“form-group”> <label class=“sr-only” for=“nickname”>昵称:</label> <input id=“nickname” name=“nickname” type=“text” class=“form-control” placeholder=“昵称” /> </div> <button id=“searchUserListButton” class=“btn yellow-casablanca” type=“button”>搜 索</button> </form> </div>使用jGrid发送请求给后台 // 条件查询所有用户列表 $("#searchUserListButton").click(function(){ var searchUsersListForm = $("#searchUserListForm"); jqGrid.jqGrid().setGridParam({ page: 1, url: hdnContextPath + “/users/list.action?” + searchUsersListForm.serialize(), }).trigger(“reloadGrid”); });二、背景音乐BGM的上传、查询和删除上传 $("#file").fileupload({ pasteZone: “#bgmContent”, dataType: “json”, done: function(e, data) { console.log(data); if (data.result.status != ‘200’) { alert(“长传失败…”); } else { var bgmServer = $("#bgmServer").val(); var url = bgmServer + data.result.data; $("#bgmContent").html("<a href=’" + url + “’ target=’_blank’>点我播放</a>”); $("#path").attr(“value”, data.result.data); } } });后台接口保存BGM的方法参考上传头像的方法分页查询参考用户列表信息的分页查询多少删除BGM var deleteBgm = function(bgmId) { var flag = window.confirm(“是否确认删除???”); if (!flag) { return; } $.ajax({ url: $("#hdnContextPath").val() + ‘/video/delBgm.action?bgmId=’ + bgmId, type: “POST”, success: function(data) { if (data.status == 200 && data.msg == ‘OK’) { alert(‘删除成功~~’); var jqGrid = $("#bgmList"); jqGrid.jqGrid().trigger(“reloadGrid”); } } })}三、举报管理禁止播放var forbidVideo = function(videoId) { var flag = window.confirm(“是否禁播”); if (!flag) { return; } $.ajax({ url: $("#hdnContextPath").val() + “/video/forbidVideo.action?videoId=” + videoId, type: “POST”, async: false, success: function(data) { if(data.status == 200 && data.msg == “OK”) { alert(“操作成功”); var jqGrid = $("#usersReportsList"); //reloadGrid是重新加载表格 jqGrid.jqGrid().trigger(“reloadGrid”); } else { console.log(JSON.stringify(data)); } } })}四、后台管理系统增加或删除BGM,向zookeeper-server创建子节点,让小程序后端监听【重点】1、首先安装Zookeeper到Linux上,启动服务器2、编写zk客户端代码:import org.apache.curator.framework.CuratorFramework;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.ZooDefs.Ids;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class ZKCurator { //zk客户端 private CuratorFramework client = null; final static Logger log = LoggerFactory.getLogger(ZKCurator.class); public ZKCurator(CuratorFramework client) { this.client = client; } public void init() { client = client.usingNamespace(“admin”); try { //判断在admin命名空间下是否有bgm节点 /admin/bgm if( client.checkExists().forPath("/bgm") == null ) { //对于zk来讲,有两种类型的节点,一种是持久节点(永久存在,除非手动删除),另一种是临时节点(会话断开,自动删除) client.create().creatingParentContainersIfNeeded() .withMode(CreateMode.PERSISTENT) //持久节点 .withACL(Ids.OPEN_ACL_UNSAFE) //匿名权限 .forPath("/bgm"); log.info(“zookeeper客户端连接初始化成功”); log.info(“zookeeper服务端状态:{}",client.isStarted()); } } catch (Exception e) { log.error(“zookeeper客户端连接初始化失败”); e.printStackTrace(); } } /* * 增加或者删除Bgm,向zk-server创建子节点,供小程序后端监听 * @param bgmId * @param operType */ public void sendBgmOperator(String bgmId, String operObject) { try { client.create().creatingParentContainersIfNeeded() .withMode(CreateMode.PERSISTENT) //持久节点 .withACL(Ids.OPEN_ACL_UNSAFE) //匿名权限 .forPath("/bgm/” + bgmId, operObject.getBytes()); } catch (Exception e) { e.printStackTrace(); } }}3、在applicationContext-zookeeper.xml配置zookeeper: <!– 创建重连策列 –> <bean id=“retryPolicy” class=“org.apache.curator.retry.ExponentialBackoffRetry”> <!– 每次重试连接的等待时间 –> <constructor-arg index=“0” value=“1000”></constructor-arg> <!– 设置最大的重连次数 –> <constructor-arg index=“1” value=“5”></constructor-arg> </bean> <!– 创建zookeeper客户端 –> <bean id=“client” class=“org.apache.curator.framework.CuratorFrameworkFactory” factory-method=“newClient” init-method=“start”> <constructor-arg index=“0” value=“120.79.18.35:2181”></constructor-arg> <constructor-arg index=“1” value=“10000”></constructor-arg> <constructor-arg index=“2” value=“10000”></constructor-arg> <constructor-arg index=“3” ref=“retryPolicy”></constructor-arg> </bean> <!– 调用init方法启动 –> <bean id=“ZKCurator” class=“com.imooc.web.util.ZKCurator” init-method=“init”> <constructor-arg index=“0” ref=“client”></constructor-arg> </bean>4、上传或者删除BGM时调用VideoServiceImpl.java的方法 @Autowired private ZKCurator zKCurator; @Override public void addBgm(Bgm bgm) { String id = sid.nextShort(); bgm.setId(id); bgmMapper.insert(bgm); Map<String, String> map = new HashMap<>(); map.put(“operType”, BGMOperatorTypeEnum.ADD.type); map.put(“path”, bgm.getPath()); zKCurator.sendBgmOperator(id, JSONUtils.toJSONString(map)); } @Override public void deleteBgm(String id) { Bgm bgm = bgmMapper.selectByPrimaryKey(id); bgmMapper.deleteByPrimaryKey(id); Map<String, String> map = new HashMap<>(); map.put(“operType”, BGMOperatorTypeEnum.DELETE.type); map.put(“path”, bgm.getPath()); zKCurator.sendBgmOperator(id, JSONUtils.toJSONString(map)); }5、小程序编写代码监听zookeeper的节点,并对其做出相应的删除和上传操作【重点】初始化zookeeper客户端 private CuratorFramework client = null; final static Logger log = LoggerFactory.getLogger(ZKCuratorClient.class);// public static final String ZOOKEEPER_SERVER = “120.79.18.36:2181”; public void init() { if(client != null) { return; } //重试策略 RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 5); //创建zk客户端 120.79.18.36:2181 client = CuratorFrameworkFactory.builder().connectString(resourceConfig.getZookeeperServer()).sessionTimeoutMs(10000) .retryPolicy(retryPolicy).namespace(“admin”).build(); //启动客户端 client.start(); try { addChildWatch("/bgm"); } catch (Exception e) { e.printStackTrace(); } } 监听zk-server的节点,当短视频后台管理系统上传或者删除某个BGM的时候,小程序后台服务器通过Zookeeper监听自动下载背景音乐public void addChildWatch(String nodePath) throws Exception { final PathChildrenCache cache = new PathChildrenCache(client, nodePath, true); cache.start(); cache.getListenable().addListener(new PathChildrenCacheListener() { @Override public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception { if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_ADDED)){ log.info(“监听到事件CHILD_ADDED”); //1. 从数据库查询bgm对象,获取路径Path String path = event.getData().getPath(); String operatorObjStr = new String(event.getData().getData()); Map<String, String> map = JsonUtils.jsonToPojo(operatorObjStr, Map.class); String operatorType = map.get(“operType”); String songPath = map.get(“path”);// String[] arr = path.split("/");// String bgmId = arr[arr.length-1];// Bgm bgm = bgmService.queryBgmById(bgmId);// if(bgm == null){// return;// } //1.1 bgm所在的相对路径// String songPath = bgm.getPath(); //2. 定义保存到本地的bgm路径// String filePath = “E:\imooc_videos_dev” + songPath; String filePath = resourceConfig.getFileSpace() + songPath; //3. 定义下载的路径(播放url) String[] arrPath = songPath.split("\\"); //windows// String[] arrPath = songPath.split("/"); //linux String finalPath = “”; //3.1 处理url的斜杠以及编码 for(int i=0; i<arrPath.length;i++){ if(StringUtils.isNotBlank(arrPath[i])) { finalPath += “/”; finalPath += URLEncoder.encode(arrPath[i], “UTF-8”); } }// String bgmUrl = “http://192.168.199.150:8080/mvc” + finalPath; String bgmUrl = resourceConfig.getBgmServer() + finalPath; if(operatorType.equals(“1”)){ //下载bgm到springboot服务器 URL url = new URL(bgmUrl); File file = new File(filePath); FileUtils.copyURLToFile(url, file); client.delete().forPath(path); }else if(operatorType.equals(“2”)){ File file = new File(filePath); FileUtils.forceDelete(file); client.delete().forPath(path); } } } }); } ...

April 11, 2019 · 5 min · jiezi