最完整的SSM框架搭建流程
1.新建一个Maven项目
- 这里以Idea工具为例,打开IDEA,然后File->New->Project ->Maven->Create from archetype。
2.在pom.xml中添加项目所需的依赖包
<!-- SpringMVC,包含有spring-aop,spring-beans,spring-context,spring-core,springexpression,spring-web,spring-webmvc包 --><dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency><!-- Spring事务包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.14.RELEASE</version>
</dependency><dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency><!-- Spring事务包 --> <!--AOP依赖包--><dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.2</version>
</dependency><dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency><!--AOP依赖包--> <!--AOP的CGLIB动态代理实现包--><dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.2</version>
</dependency><!-- servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency><!-- c3p0 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency><!-- MySQL驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency><!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency><dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- mybatis --><!-- Gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency><!-- SLF4J日志.注意版本问题,高版本与java8不兼容 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency><dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
<scope>runtime</scope>
</dependency><dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.9.1</version>
<scope>runtime</scope>
</dependency><dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.9.1</version>
<scope>runtime</scope>
</dependency><!-- SLF4J日志结束 -->
<!--高性能的异步处理框架,提高log4j2并发性能--><dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
<scope>runtime</scope>
</dependency><!-- LomBok,POJO管理框架-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
3.新建类目录和资源目录
- 在src下面的main文件夹上右击,New->Directory,新建一个Java目录和一个resources目录。
- 然后在Java目录上右键,Mark Directory as -> Sources Root
- 接着在resources目录上右键,Mark Directory as -> Resources Root
- 最终效果如下图,注意java与resources文件夹的颜色与样式。
- 如果需要测试文件目录的,还可以在main目录下面创建一个test文件,然后右键test目录,Mark Directory as -> Test Sources Root,类似地,测试的资源目录也是一样,将其标记为Test Resources Root就可以了。
4.新建项目包结构
- 在java目录右击鼠标,New->Package,新建项目的包名,将需要用到的包名建好,一般是以公司或者组织的组织Id开头,然后在下面细分为controller,service,dao,bean,utils等子包。
- 项目包结构建好之后整个项目的目录结构如下图:
- PS:考虑到初学者可能无法顺利的创建出上面的包结构,这里给出一个小提示,如果要实现上图目录中的两个子包(比如controller和service)在同一级(同一父包,com.yixiaojun.ssdmdemo如)下,则需要在java文件目录下右键,然后输入两个包的全路径:,,这样就可以出现两个子包在同一级下的效果了,然后就可以右键父包,输入其他子包的名字,从而创建出上图中的包结构了。
5.配置项目
- 当上面的任务都完成了之后,就可以对项目进行配置了,在进行配置之前,我们需要按照下图的文件结构创建几个文件夹和配置文件。
6.配置文件的内容如下
- database.properties
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sc?
serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=true
jdbc.username=root
jdbc.password=123456
jdbc.maxPoolSize=100
jdbc.minPoolSize=10
jdbc.initialPoolSize=20
jdbc.maxIdleTime=25000
jdbc.acquireIncrement=5
jdbc.maxStatements=5
jdbc.idleConnectionTestPeriod=18000
- jdbc.url后面的值需要换成自己的数据库地址,后面的值需要换成自己的数据库用户名,后面的值需要换成自己的用户密码。
- web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"><!--定义web应用的名称-->
<display-name>ssmdemo</display-name><!--指定Spring上下文参数配置文件的路径-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/spring-context.xml</param-value>
</context-param><!-- Spring上下文监听器,用来加载Spring的上下文配置并初始化Spring -->
<listener>
<description>启动spring容器</description>
<listenerclass>
org.springframework.web.context.ContextLoaderListener</listener-class>
</listener><!-- LOG4J上下文监听器,用来加载LOG4J2的配置并初始化LOG4J --><listener>
<listenerclass>
org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener><!-- 字符编码过滤器,将编码改为UTF-8-->
<filter>
<filter-name>encodingFilter</filter-name>
<filterclass>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>encodingFilter</filter-name>
<url-pattern>
</filter-mapping><!-- SpringMVC前置控制器,拦截匹配的请求,把拦截下来的请求,根据相应的规则分发到目标Controller来处理--><servlet>
<servlet-name>spring-mvc</servlet-name>
<servletclass>
org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定路径SpringMVC上下文配置路径-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/spring-mvc.xml</param-value>
</init-param>
<!-- 随web应用启动而启动 -->
<load-on-startup>1</load-on-startup>
</servlet><servlet-mapping>
spring-context.xml
<servlet-name>spring-mvc</servlet-name>
<!--指定所有请求都通过DispatcherServlet来处理-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- spring-context.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"
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">
<context:property-placeholder
location="classpath:database/database.properties"/><!-- 配置c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="minPoolSize" value="${jdbc.minPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
<property name="initialPoolSize" value="${jdbc.initialPoolSize}">
</property>
<property name="acquireIncrement" value="${jdbc.acquireIncrement}">
</property><property name="maxIdleTime" value="${jdbc.maxIdleTime}"></property>
<property name="maxStatements" value="${jdbc.maxStatements}"></property>
<property name="idleConnectionTestPeriod"value="${jdbc.idleConnectionTestPeriod}"></property>
<property name="testConnectionOnCheckin" value="false"></property>
<property name="testConnectionOnCheckout" value="true"></property>
</bean><!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean><!-- 使用注解来控制事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/><!-- 配置mybatis, 绑定c3p0-->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
spring-mvc.xml
<property name="configLocation" value="/WEB-INF/mybatis/mybatisconfig.xml"></property><property name="mapperLocations"><list>
<value>classpath:mapper</value>
</list>
</property>
</bean><!-- 在会话工厂中取出SqlSessionTemplate对象,用于执行项目的持久化操作 -->
<bean class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean><!-- 自动扫描 将Mapper接口生成代理注入到Spring -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!--给出需要扫描的接口,注意此处包名要换成自己项目中的Mapper接口所在的包名,如果有多个包,可以使用分号或者逗号隔开--><property name="basePackage" value="com.yixiaojun.ssmdemo.dao">
</property>
</bean>
</beans>
- spring-mvc.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:mvc="http://www.springframework.org/schema/mvc"
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/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"><!--开启Spring MVC注解驱动,它会自动注册DefaultAnnotationHandlerMapping与
AnnotationMethodHandlerAdapter两个bean,--><!--这两个bean是Spring MVC为@Controllers分发请求所必须的,即解决了@Controller注解使用的前提配置。-->
<mvc:annotation-driven /><!--开启跨域功能-->
<!--/**的意思是所有文件夹及里面的子文件夹-->
<!--/*是所有文件夹,不含子文件夹-->
<!--/是web项目的根目录--><mvc:cors>
<mvc:mapping path="/**"/>
</mvc:cors>
<!-- 让Spring扫描这个包下所有的类,让标注Spring注解的类生效,此处的包名应改为自己项目的包名 -->
<context:component-scan base-package="com.yixiaojun.ssmdemo" />
<!--为Spring容器中那些配置@Aspect切面的bean创建代理,织入切面,根据运行类选择 JDK 或CGLIB 代理-->
<aop:aspectj-autoproxy/>
</beans>
- 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>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="defaultStatementTimeout" value="3000"/><!--开启自动驼峰命名规则映射,如将数据库列名 A_COLUMN 映射成Java属性名aColumn-->
<setting name="mapUnderscoreToCamelCase" value="true"/><!--使用LOG4J2日志-->
<setting name="logImpl" value="LOG4J2"/><!-- 指定CGLIB代理 -->
<setting name="proxyFactory" value="CGLIB"/>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
</configuration>
- log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL-->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成
trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="1800">
<Properties>
<!-- 日志默认存放的位置,这里设置为项目根路径下,也可指定绝对路径 -->
<!-- ${web:rootDir}是web项目根路径,java项目没有这个变量,需要删掉,否则会报异常 -->
<property name="basePath">${web:rootDir}/log4j2Logs</property>
<!-- <property name="basePath">d:/qfxSpringMVCMybaitsDemoLogs</property>-->
<!-- 控制台默认输出格式,"%-5level":日志级别,"%l":输出完整的错误位置,是小写的L,因为有行号显示,所以影响日志输出的性能 -->
<property name="console_log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS}[%-5level] %l - %m%n</property><!-- 日志文件默认输出格式,不带行号输出(行号显示会影响日志输出性能);%C:大写,类名;%M:方法名;%m:错误信息;%n:换行 -->
<property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level]%C.%M - %m%n</property><!-- 日志默认切割的最小单位 -->
<property name="every_file_size">20MB</property><!-- 日志默认输出级别 -->
<property name="output_log_level">DEBUG</property><!-- 日志默认存放路径(所有级别日志) -->
<property name="rolling_fileName">${basePath}/all.log</property><!-- 日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
<property name="rolling_filePattern">${basePath}/%d{yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log.gz</property><!-- 日志默认同类型日志,同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
<property name="rolling_max">50</property><!-- Info日志默认存放路径(Info级别日志) -->
<property name="info_fileName">${basePath}/info.log</property>
<!-- Info日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 ->
<property name="info_filePattern">${basePath}/%d{yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz</property><!-- Info日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
<property name="info_max">10</property><!-- Warn日志默认存放路径(Warn级别日志) -->
<property name="warn_fileName">${basePath}/warn.log</property><!-- Warn日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 --><property name="warn_filePattern">${basePath}/%d{yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz</property><!-- Warn日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
<property name="warn_max">10</property><!-- Error日志默认存放路径(Error级别日志) -->
<property name="error_fileName">${basePath}/error.log</property><!-- Error日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
<property name="error_filePattern">${basePath}/%d{yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz</property><!-- Error日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
<property name="error_max">10</property><!-- 控制台显示的日志最低级别 -->
<property name="console_print_level">DEBUG</property>
</Properties><!--定义appender -->
<appenders><!-- 用来定义输出到控制台的配置 -->
<Console name="Console" target="SYSTEM_OUT"><!-- 设置控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="${console_print_level}" onMatch="ACCEPT"onMismatch="DENY"/><!-- 设置输出格式,不设置默认为:%m%n --><PatternLayout pattern="${console_log_pattern}"/>
</Console><!-- 打印root中指定的level级别以上的日志到文件 -->
<RollingFile name="RollingFile" fileName="${rolling_fileName}"
filePattern="${rolling_filePattern}">
<PatternLayout pattern="${log_pattern}"/>
<SizeBasedTriggeringPolicy size="${every_file_size}"/><!-- 设置同类型日志,同一文件夹下可以存放的数量,如果不设置此属性则默认存放7个文件-->
<DefaultRolloverStrategy max="${rolling_max}" /><!-- 匹配INFO以及以上级别 -->
<Filters>
<ThresholdFilter level="INFO" onMatch="ACCEPT"onMismatch="DENY"/>
</Filters>
</RollingFile><!-- 打印INFO级别的日志到文件 -->
<RollingFile name="InfoFile" fileName="${info_fileName}"
filePattern="${info_filePattern}">
<PatternLayout pattern="${log_pattern}"/>
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
<DefaultRolloverStrategy max="${info_max}" /><!-- 匹配INFO级别 -->
<Filters>
<ThresholdFilter level="WARN" onMatch="DENY"onMismatch="NEUTRAL"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT"onMismatch="DENY"/>
</Filters>
</RollingFile><!-- 打印WARN级别的日志到文件 -->
<RollingFile name="WarnFile" fileName="${warn_fileName}"filePattern="${warn_filePattern}">
<PatternLayout pattern="${log_pattern}"/>
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
<DefaultRolloverStrategy max="${warn_max}" /><!-- 匹配WARN级别 -->
<Filters>
<ThresholdFilter level="ERROR" onMatch="DENY"
onMismatch="NEUTRAL"/>
<ThresholdFilter level="WARN" onMatch="ACCEPT"
onMismatch="DENY"/>
</Filters>
</RollingFile>
<!-- 打印ERROR级别的日志到文件 -->
<RollingFile name="ErrorFile" fileName="${error_fileName}"
filePattern="${error_filePattern}">
<PatternLayout pattern="${log_pattern}"/>
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
<DefaultRolloverStrategy max="${error_max}" /><!-- 匹配ERROR级别 -->
<Filters>
<ThresholdFilter level="FATAL" onMatch="DENY"onMismatch="NEUTRAL"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT"onMismatch="DENY"/>
</Filters>
</RollingFile>
</appenders><!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--<!– 设置对打印sql语句的支持 –>-->
<logger name="java.sql" level="INFO">
<appender-ref ref="Console"/>
</logger>
<logger name="org.apache.ibatis" level="INFO">
<appender-ref ref="Console"/>
</logger><!--建立一个默认的root的logger-->
<root level="${output_log_level}">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
<appender-ref ref="InfoFile"/>
<appender-ref ref="WarnFile"/>
<appender-ref ref="ErrorFile"/>
</root>
</loggers>
</configuration>
- 至此,整个项目的基本配置已经配置好了,如果需要添加其他的功能,则可以根据需求来进行配置。
6.数据库搭建
- 在正式写我们的代码之前,我们还需要搭建一下数据库,下面给出我的SQL代码:
/*
Navicat MySQL Data Transfer
Source Server : 本机
Source Server Version : 50553
Source Host : localhost:3306
Source Database : sc
Target Server Type : MYSQL
Target Server Version : 50553
File Encoding : 65001
Date: 2019-07-8 09:43:22
*/
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`CId` varchar(10) DEFAULT NULL,
`Cname` varchar(10) DEFAULT NULL,
`TId` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
INSERT INTO `course` VALUES ('01', '语文', '02');INSERT INTO `course` VALUES ('02', '数学', '01');INSERT INTO `course` VALUES ('03', '英语', '03');
DROP TABLE IF EXISTS `sc`;CREATE TABLE `sc` (`SId` varchar(10) DEFAULT NULL,`CId` varchar(10) DEFAULT NULL,`score` decimal(18,1) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
INSERT INTO `sc` VALUES ('01', '01', '80.0');INSERT INTO `sc` VALUES ('01', '02', '90.0');INSERT INTO `sc` VALUES ('01', '03', '99.0');INSERT INTO `sc` VALUES ('02', '01', '70.0');INSERT INTO `sc` VALUES ('02', '02', '60.0');INSERT INTO `sc` VALUES ('02', '03', '80.0');INSERT INTO `sc` VALUES ('03', '01', '80.0');INSERT INTO `sc` VALUES ('03', '02', '80.0');INSERT INTO `sc` VALUES ('03', '03', '80.0');INSERT INTO `sc` VALUES ('04', '01', '50.0');INSERT INTO `sc` VALUES ('04', '02', '30.0');INSERT INTO `sc` VALUES ('04', '03', '20.0');INSERT INTO `sc` VALUES ('05', '01', '76.0');INSERT INTO `sc` VALUES ('05', '02', '87.0');INSERT INTO `sc` VALUES ('06', '01', '31.0');INSERT INTO `sc` VALUES ('06', '03', '34.0');INSERT INTO `sc` VALUES ('07', '02', '89.0');INSERT INTO `sc` VALUES ('07', '03', '98.0');
DROP TABLE IF EXISTS `student`;CREATE TABLE `student` (`SId` int(11) NOT NULL,`Uid` int(11) NOT NULL,`Sname` varchar(10) DEFAULT NULL,`Sage` datetime DEFAULT NULL,`Ssex` varchar(10) DEFAULT NULL,PRIMARY KEY (`SId`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
INSERT INTO `student` VALUES ('1', '1', '赵雷', '1990-01-01 00:00:00', '男');INSERT INTO `student` VALUES ('2', '3', '钱电', '1990-12-21 00:00:00', '男');INSERT INTO `student` VALUES ('3', '4', '孙风', '1990-12-20 00:00:00', '男');INSERT INTO `student` VALUES ('4', '5', '李云', '1990-12-06 00:00:00', '男');INSERT INTO `student` VALUES ('5', '8', '周梅', '1991-12-01 00:00:00', '女');INSERT INTO `student` VALUES ('6', '9', '吴兰', '1992-01-01 00:00:00', '女');INSERT INTO `student` VALUES ('7', '10', '郑竹', '1989-01-01 00:00:00', '女');INSERT INTO `student` VALUES ('9', '11', '张三丰', '2017-12-20 00:00:00', '女');INSERT INTO `student` VALUES ('10', '12', '李武', '2017-12-25 00:00:00', '女');INSERT INTO `student` VALUES ('11', '13', '李洋', '2012-06-06 00:00:00', '女');INSERT INTO `student` VALUES ('12', '14', '赵六', '2013-06-13 00:00:00', '女');INSERT INTO `student` VALUES ('13', '15', '孙七', '2014-06-01 00:00:00', '女');
DROP TABLE IF EXISTS `teacher`;CREATE TABLE `teacher` (`TId` int(10) NOT NULL AUTO_INCREMENT,`Uid` int(11) NOT NULL,`Tname` varchar(10) DEFAULT NULL,`Tage` datetime DEFAULT NULL,`TSex` varchar(10) DEFAULT NULL,PRIMARY KEY (`TId`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
INSERT INTO `teacher` VALUES ('1', '2', '张三', '1970-03-01 00:00:00', '男');INSERT INTO `teacher` VALUES ('2', '6', '李四', '1982-01-01 00:00:00', '女');INSERT INTO `teacher` VALUES ('3', '7', '王五', '1993-01-01 00:00:00', '男');
DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`Uid` int(11) NOT NULL AUTO_INCREMENT,`account` varchar(20) NOT NULL,`password` varchar(20) NOT NULL,`role` int(11) DEFAULT '1' COMMENT '1是学生,2是老师',PRIMARY KEY (`Uid`),UNIQUE KEY `account` (`account`)) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', '123', '123', '1');INSERT INTO `user` VALUES ('2', '1234', '1234', '2');INSERT INTO `user` VALUES ('3', '12345', '12345', '1');INSERT INTO `user` VALUES ('4', '123456', '12345', '1');INSERT INTO `user` VALUES ('5', 'abc', '1234', '1');INSERT INTO `user` VALUES ('6', 'abc123', '1234', '2');INSERT INTO `user` VALUES ('7', 'admin', 'admin', '2');INSERT INTO `user` VALUES ('8', 'test', 'test', '1');INSERT INTO `user` VALUES ('9', 'admin123', '1234', '1');INSERT INTO `user` VALUES ('10', 'zhengzhu', '1234', '1');INSERT INTO `user` VALUES ('11', 'zhangsanfeng', '1234', '1');INSERT INTO `user` VALUES ('12', 'liwu', '1234', '1');INSERT INTO `user` VALUES ('13', 'liyang', '1234', '1');INSERT INTO `user` VALUES ('14', 'zhaoliu', '1234', '1');INSERT INTO `user` VALUES ('15', 'sunqi', '1234', '1');
7.写一个登录接口
- 首先,我们先来看一下项目代码结果,看一下编写一个登录接口需要哪些类。
- 接下来是具体的代码,首先是Model层的代码:
- ResponseContent.java
package com.yixiaojun.ssmdemo.bean;import lombok.AllArgsConstructor;import lombok.Data;/*** @Author:xpf* @Date:2019/7/8* @Description:*/@AllArgsConstructor@Datapublic class ResponseContent {private String code;
private String message;
private Object contents;
}
- User.java
package com.yixiaojun.ssmdemo.bean;import lombok.Data;/*** @Author:xpf* @Date:2019/7/8* @Description:*/@Datapublic class User {
int uId;
int role;
}
- Student.java
package com.yixiaojun.ssmdemo.bean;import lombok.Data;/*** @Author:xpf* @Date:2019/7/8* @Description:*/@Datapublic class User {
int uId;
int role;
}
- 接下来是工具类:
- Constant.java
package com.yixiaojun.ssmdemo.utils;import java.util.HashMap;import java.util.Map;/*** @Author:yixiaojun* @Date:2019/7/8* @Description:*/public class Constant {public final static String SUCCESS_CODE = "CO1";public final static String ERROR_CODE = "E01";JsonResolver.javapublic final static String SUCCESS_MESSAGE = "调用成功";public final static Map<String,String> SEESION_MAP = new HashMap<>();}
- JsonResolver.java
package com.yixiaojun.ssmdemo.utils;import com.google.gson.*;import com.google.gson.reflect.TypeToken;import com.yixiaojun.ssmdemo.bean.ResponseContent;import lombok.Cleanup;import lombok.SneakyThrows;import javax.servlet.http.HttpServletRequest;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.lang.reflect.Type;import java.util.HashMap;import java.util.Map;import java.util.Set;/*** @Author:yixiaojun* @Date:2019/7/8* @Description:*/public class JsonResolver {private final static int BUFFER_SIZE = 4096;private Gson gson;private static JsonResolver jsonResolver;private JsonResolver(){//根据自己需要将Json解析成的类型来创建一个Gson对象,此处的参数类型为HashMap<String, Object>gson = new GsonBuilder().registerTypeAdapter(newTypeToken<HashMap<String, Object>>() {}.getType(), newJsonDeserializer<HashMap<String,Object>>() {@Overridepublic HashMap<String, Object> deserialize(JsonElement jsonElement,Type type, JsonDeserializationContext jsonDeserializationContext) throwsJsonParseException {HashMap<String, Object> hashMap = new HashMap<>(16);JsonObject jsonObject = jsonElement.getAsJsonObject();Set<Map.Entry<String,JsonElement>> entrySet =jsonObject.entrySet();for (Map.Entry<String,JsonElement> entry :entrySet){if (entry.getValue() instanceof JsonArray){hashMap.put(entry.getKey(),entry.getValue());}else {hashMap.put(entry.getKey(),entry.getValue().toString().replace("\"",""));}}return hashMap;}}).create();}/*** 使用单例模式生成一个对象JsonResolver对象* @return 返回一个JsonResolver对象*/public static JsonResolver getInstance(){if (jsonResolver == null){jsonResolver = new JsonResolver();}return jsonResolver;}/*** 将request对象里面的参数通过Gson转成HashMap<String, Object>* @param request* @return 存放解析之后的参数的map*/@SneakyThrowspublic HashMap<String, Object> request2HashMap(HttpServletRequest request){HashMap<String,Object> map = new HashMap<>(16);String requestParm = null;requestParm = new String(inputStreamToByte(request),"UTF-8");requestParm = java.net.URLDecoder.decode(requestParm,"UTF-8");map = gson.fromJson(requestParm,new TypeToken<HashMap<String,Object>>(){}.getType());return map;}/*** 将获取到的输入流转成字节数组* @param request* @return* @throws IOException*/@SneakyThrowsprivate byte[] inputStreamToByte(HttpServletRequest request) {@Cleanup ByteArrayOutputStream outStream = new ByteArrayOutputStream();byte[] data = new byte[BUFFER_SIZE];int count = -1;while ((count = request.getInputStream().read(data, 0, BUFFER_SIZE)) !=-1){outStream.write(data, 0, count);}return outStream.toByteArray();}/*** 将要返回给前端数据转换成Json格式* @param code 标识码,标识接口调用成功或失败* @param message 提示信息* @param content 真正要获取的内容* @return*/@SneakyThrowspublic String jsonAssembly(String code, String message, Object content) {ResponseContent responseContent = newResponseContent(code,message,content);LogInterceptor.javaString jsonStr = null;jsonStr = gson.toJson(responseContent);return jsonStr;}}
- LogInterceptor.java
package com.yixiaojun.ssmdemo.utils;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.HashMap;/*** @Author:yixiaojun* @Date:2019/7/8* @Description:*/@Slf4j@Aspect@Componentpublic class LogInterceptor {/*** 拦截所有的controller包下面的接口(方法),使用了AOP的方法,在调用controller包下的方法时都会先调用这个方法,经过处理之后才会转发到真正的方法* @param joinPoint* @throws Throwable*/@Around("execution(* com.yixiaojun.ssmdemo.controller..*.*(..))")public void process(ProceedingJoinPoint joinPoint) throws Throwable {String apiName = joinPoint.getTarget().getClass().getName() + "."+joinPoint.getSignature().getName();HttpServletRequest request = (HttpServletRequest)joinPoint.getArgs()[0];//将前端传过来的数据解析成MapHashMap<String,Object> map =JsonResolver.getInstance().request2HashMap(request);HttpServletResponse response = (HttpServletResponse)joinPoint.getArgs()[1];//将字符编码改成UTF-8,解决部分浏览器在控制台显示乱码问题response.setContentType("application/json;charset=UTF-8");log.info("------接口-----"+ apiName + "()-------start-----");String loginFunName ="com.yixiaojun.ssmdemo.controller.UserController.login";String changePasswordFunName ="com.yixiaojun.ssmdemo.controller.UserController.changePassword";String registerFunName ="com.yixiaojun.ssmdemo.controller.UserController.register";//如果不是调用登录、修改密码、注册三个接口,就进行一次sessionId验证,验证不通过直接返回if (!(loginFunName.equals(apiName) ||changePasswordFunName.equals(apiName) || registerFunName.equals(apiName))){String sessionIdKey = "sessionId";if(com.yixiaojun.ssmdemo.utils.Constant.SEESION_MAP.get(map.get(sessionIdKey).toString()) == null){response.getWriter().print(JsonResolver.getInstance().jsonAssembly(com.yixiaojun.ssmdemo.utils.Constant.ERROR_CODE, "调用失败", null));log.info("------接口-----"+ apiName + "()-------end-----");return;}}/*** Spring中request.getInputStream() 和request.getReader()只能被获取一次,* 而@RequestBody注解参数的底层实现也是通过流来获取请求参数的,* 所以需要将解析完的参数用一个键值对存起来,以便在控制层直接读取*/request.setAttribute("paramMap",map);Object[] args = new Object[]{request, response};joinPoint.proceed(args);log.info("------接口-----"+ apiName + "()-------end-----");}}
- 接着是Dao层的代码:
- UserDao.java
package com.yixiaojun.ssmdemo.dao;import com.yixiaojun.ssmdemo.bean.User;import org.apache.ibatis.annotations.Param;import org.springframework.stereotype.Repository;/*** @Author:yixiaojun* @Date:2019/7/8* @Description:*/@Repositorypublic interface UserDao {/*** 根据帐号密码查询用户接着是Service层的代码:UserService.javaUserServiceImpl.java* @Author:yixiaojun* @param account 帐号* @param password 密码* @return 根据帐号密码查询到的用户信息或者为空*/User login(@Param("account") String account, @Param("password") Stringpassword);}
- 接着是Service层的代码:
- UserService.java
package com.yixiaojun.ssmdemo.service;import com.yixiaojun.ssmdemo.bean.User;/*** @Author:yixiaojun* @Date:2019/7/8* @Description:*/public interface UserService {/*** 根据帐号密码查询用户* @Author:yixiaojun* @param account 帐号* @param password 密码* @return 根据帐号密码查询到的用户信息*/User login(String account, String password);}
- UserServiceImpl.java
package com.yixiaojun.ssmdemo.service;import com.yixiaojun.ssmdemo.bean.User;import com.yixiaojun.ssmdemo.dao.UserDao;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;/*** @Author:yixiaojun* @Date:2019/7/8* @Description:*/@Service(value = "UserServiceImpl")public class UserServiceImpl implements UserService {@AutowiredUserDao userDao;@Overridepublic User login(String account, String password) {return userDao.login(account,password);}}
- 最后是控制层的代码:
- UserController.java
package com.yixiaojun.ssmdemo.controller;import com.yixiaojun.ssmdemo.bean.User;import com.yixiaojun.ssmdemo.service.UserService;import com.yixiaojun.ssmdemo.utils.Constant;import com.yixiaojun.ssmdemo.utils.JsonResolver;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.HashMap;/*** @Author:yixiaojun* @Date:2019/7/8* @Description:*/@Controller@RequestMapping("/user")public class UserController {@Resource(name = "UserServiceImpl")UserService userService;/*** 登录接口,用户登录时调用* @Author:yixiaojun* @param request 前端传来的参数,参数为Json格式,示例为:{"account":"1234","password":"1234"},分别代表账号和密码* @param response* @throws IOException*/@RequestMapping(value = "/login",method = RequestMethod.POST)public void login(HttpServletRequest request, HttpServletResponse response)throws IOException {@SuppressWarnings("unchecked")
HashMap<String,Object> map =(HashMap<String,Object>)request.getAttribute("paramMap");
Useruser=userService.login(map.get("account").toString(),map.get("password").toString());
response.getWriter().print(JsonResolver.getInstance().jsonAssembly(Constant.SUCCESS_CODE,Constant.SUCCESS_MESSAGE,user));
}
}
- 至此,我们的代码已经全部写好了,但是在将我们的代码跑起来之前,我们还需要配置下Tomcat:
- 1.首先,在工具栏找到下图中的Edit Configurations,点击进入配置窗口。
- 2.接下来在配置窗口添加Tomcat服务器。
- 到这里,我们就配置好了Tomcat服务器了,可以愉快地点击工具栏的运行按钮来运行项目了.
- 考虑到有的同学不知道war和war exploded的区别,我在这里简单地解释一下:
- war模式:将WEB工程以包的形式上传到服务器
- war exploded模式:将WEB工程以当前文件夹的位置关系上传到服务器
- 1)war模式这种可以称之为是发布模式,看名字也知道,这是先打成war包,再发布
- 2)war exploded模式是直接把文件夹、jsp页面 、classes等等移到Tomcat 部署文件夹(target目录)里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。
- 3)在平时开发的时候,使用热部署的话,应该对Tomcat进行相应的设置,这样的话修改的jsp界面才可以及时的显示出来。
- 通过war模式获取项目的相对路径是Tomcat的安装目录所在位置,看出通过war模式是最终打包部署到Tomcat的安装目录的所在位置。
- 通过war exploded模式获取项目的相对路径是项目target目录的位置,看出通过war模式是最终打包部署到项目target目录的位置。
- 两种方式得部署方式是不一样的,因此在获取项目的相对路径的时候得到的结果是不一样的。
8.使用Postman测试接口
- 将以上工作都做好了之后,我们就可以在Postman测试一下我们写的接口是否可以正常使用了,我们新建一个测试请求,按照下图填好相关的接口URL和参数和请求方式。
- 然后我们点击一下右上角的Send按钮,就可以在下方看见接口返回的数据了。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- VMware下CentOS7网络配置
1.准备 在VMware虚拟机下安装基础的CentOS7系统,安装后通常情况下对宿主主机和外网可能都ping不通,并且为了设置固定的ip,需要对网络进行一些配置。 2.虚拟机设置 打开虚拟机设置窗口,设置虚拟机网络连接方式为:桥接模式(复制物理网络连接可选)。查看宿主机网卡:通过VM…...
2024/4/15 4:32:02 - 支付宝支付(一)——沙箱环境测试(图文)
支付宝支付(一)——沙箱环境测试(图文) 一、支付宝开放平台注册使用支付宝登录支付宝开放平台,登录成功后进入控制台进入控制台后选择自研开发服务,信息填写完毕后进入管理中心选择研发服务使用沙箱环境的第一件事情就是配置沙箱环境的基本信息,首先就是配置秘钥,我们可以…...
2024/4/24 12:32:18 - 酷我音乐完美破解版
第一步----未破解时 未破解时搜索菊花台-周杰伦是需要付费听的。第二步----破解过程 关注微信公众号未名编程,消息框回复酷我音乐即可获取破解版。双击未名编程.exe即可破解。第三步----体验破解版 双击KwMusic.exe即可使用。可以看到歌曲已经破解。并实现听付费音乐、超清MV下…...
2024/4/24 12:32:19 - 【个人记录】山东大学项目实训——疫情情况采集分析网
项目背景及意义 2020年春节突如其来的新冠疫情打乱了很多人的阵脚,网络上各类相关信息也让人目不暇接。各个国家各个地区之间的疫情状况比较这样的统计分析型信息往往由文字简单描述,不够直观。在这样的背景下,我们项目组希望能够做一个统一的疫情实况平台,可以根据需求展示…...
2024/4/24 12:32:16 - python正则表达式详解+实例
@python正则表达式详解+实例 用途 1.判断用户输入数据是否符合规则 2.爬取数据 模块 import re result = re.match(正则表达式,要匹配的字符串) 分类匹配单个字符 匹配多个字符 匹配开头结尾 匹配分组 高级语法逐一说明——匹配单个字符 \d 匹配单个字符 \d只匹配一位数字,等…...
2024/4/24 12:32:18 - leetcode-367. 有效的完全平方数刷题笔记(c++)
写在前面积累新的方式方法 脑子转不动了,扯皮扯的心好累,,,题目详情 给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。说明:不要使用任何内置的库函数,如 sqrt。示例 1:输入:16输出:True 示例 2:输入:14输出:False新…...
2024/5/3 13:18:36 - 3、数码管原理及驱动
一、发光二极管与数码管基础 1、发光二极管 圆头塑封发光二极管的正负极判断长脚为正极,短脚为负极 电极小的为正极,电极大的为负极 圆弧形边缘的为正极,直线型边缘的为负极 以上方法都无法判断,则可以借助万用表进行测量普通二极管的正向导通电压普遍在1.2V或以上,而一般…...
2024/5/3 18:58:00 - C#(结合opencvsharp)之ToBitmap()方法
opencv的mat类是没有这个方法的,但是opencvsharp扩展了这个类的方法,可以查阅官方文档:https://shimat.github.io/opencvsharp_docs/html/7b686c13-aaa7-5f3a-e2be-7da57895443f.htm,在最底下的Extension Methods部分有说明。 也就是要加上OpencvSharp.Extensions命名空间。…...
2024/4/28 17:22:27 - org.springframework.web.client.HttpClientErrorException$UnprocessableEntity: 422 UNPROCESSABLE EN
今天在使用 RestTemplate 的时候出现了这个异常:[2020-06-10 19:35:10] [kbs_dev] [ERROR] [main] com.mi.info.kbs.service.midun.MidunSupport-add admin to Midun fail..{"users":[{"uid":"1","nickname":"112"}]} org…...
2024/4/24 12:32:12 - 图书音像出租管理
给出下面一个基类的框架: class Publication { protected: string title;//名称 float price;//原价 int day;//租期 public: virtual void display()=0;//打印价格清单 } 以Publication为基类,构建Book和Tape类。 生成上述类并编写主函数,要求主函数中有一个基类Publicatio…...
2024/5/3 21:11:41 - ASP.NET Core在MacOS上建立HTTPS开发证书
安装安装 dotnet dev-certs https -trust移除 sudo dotnet dev-certs https --clean安装前安装后...
2024/4/24 12:32:09 - 后台连接数据库失败,报1045的解决方法。
后台连接数据库失败,报1045的解决方法。 1.打开phpstudy,开启数据库。2.启动后台代码,连接数据库。此时报错1045。3.找到配置文件 my.ini, 将其打开,可用记事本打开。这里推荐一个搜索软件,Everything,超好用,搜索超快。这里直接搜索my.ini。4.打开后,在 mysqld下面添加下…...
2024/4/24 12:32:11 - 错误集锦
ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing的处理方式 1.先关闭正在运行的hbase2.查看进程 , 删除HDFS中存在的HBase3.删除Zookeeper中存在的Hbase4.重新启动HBase 以上操作都是在配置了/etc/profile直接操作...
2024/4/24 12:32:07 - JavaEE学习日志(一百一十九): 品优购项目笔记(四)
品优购项目笔记(四)solr什么是solrsolr部署步骤什么是solrhomesolr中添加实例solr中添加数据域的分类集成中文分词器自定义业务域solrjsolr增删改solr查询 solr 什么是solr solr是一个apache的全文检索引擎系统, 就是个war包, 部署到Tomcat下就可以独立运行, 我们使用它的客户…...
2024/4/15 4:32:15 - python 爬网站数据 完成数据清洗 并画图
运用python爬58二手房数据导入用到的模块 xlwt, xlrd, time, requests,etreeimport xlwt, xlrd, time, requests from lxml import etree`创建工作薄,设置保存的数据,def __init__(self):self.cj = xlwt.Workbook() # 创建工作薄self.fzsj = self.cj.add_sheet(u58房子数据…...
2024/5/3 17:05:04 - quartus,modelsim,ISE相关的疑难杂症
quartus+modelsim仿真时遇到的问题verilog测试vhdl模块,clk一直为Usim设置里顶层模块名称可能没设置对quartus pin planner 通过修改qsf文件来管脚分配或者Pin Planner软件来分配管脚。可以导出csv文件,但是导入csv从没成功过。步骤一个不差成功不了,有成功的留个言...
2024/4/15 4:32:11 - 【漏洞通告】微软6月安全更新多个产品高危漏洞通告
【漏洞通告】微软6月安全更新多个产品高危漏洞通告 威胁对抗能力部 [绿盟科技安全情报](javascript:void(0)😉 今天 通告编号:NS-2020-0037 2020-06-10TA****G: 安全更新、Windows、IE、Office、Edge、Adobe Flash漏洞危害: 攻击者利用本次安全更新中的漏洞,可造成信息泄露…...
2024/4/15 4:32:10 - ubuntu18.04安装pytorch + anaconda3 +cuda(GPU)走过的坑
主要的流程参考 https://blog.csdn.net/wuzhiwuweisun/article/details/82753403 https://blog.csdn.net/red_stone1/article/details/78727096 ubuntu 16和18没什么区别; 这里主记录一下原博客没有遇到的问题: 安装了两次,花了一天半搞清楚了。第一次安装的时候安装完了,最…...
2024/4/18 7:54:25 - mysql测试连接
package com.tools;import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;import org.junit.Test;public class ConnDB {public Connection conn = null; //定义数据库指针public…...
2024/4/17 9:12:07 - MongoDB的下载与安装与环境配置
什么是MongoDBMongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL(非关系型)数据库的一种,是最像关系型数据库(MySQL)的非关系型数据库。它支持的数据结构非常松散,是一种类似于json的格式叫BSON,所以它既可以存储比较复杂…...
2024/4/15 4:32:07
最新文章
- 使用C++和QT开发第一款跨平台桌面应用程序
什么是QT? 跨平台的C图形用户界面(GUI)应用程序开发框架。 QT专注但不局限于图形用户界面的开发,其他也包括系统调用,网络编程,数据库编程,2D,3D图形处理等。 QT支持各大主流的操…...
2024/5/3 22:35:18 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 数据挖掘中的PCA和KMeans:Airbnb房源案例研究
目录 一、PCA简介 二、数据集概览 三、数据预处理步骤 四、PCA申请 五、KMeans 聚类 六、PCA成分分析 七、逆变换 八、质心分析 九、结论 十、深入探究 10.1 第 1 步:确定 PCA 组件的最佳数量 10.2 第 2 步:使用 9 个组件重做 PCA 10.3 解释 PCA 加载和特…...
2024/5/3 4:40:07 - 权限提升-Linux系统权限提升篇VulnhubRbash绕过DockerLXD容器History泄漏shell交互
知识点 1、普通用户到Linux-泄漏-History 2、普通用户到Linux-限制-Rbash绕过 3、普通用户到Linux-容器-LXD&Docker 4.Linux系统提权-web/普通用户-docker逃逸&提权&shell交互 章节点: 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及…...
2024/5/1 13:20:00 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/1 17:30:59 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/2 16:16:39 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/2 9:28:15 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/2 15:04:34 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/30 22:21:04 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/1 4:32:01 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/2 9:07:46 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57