本小节以InnoDB存储引擎为例,介绍了存储引擎级别的锁:show engine innodb status 和 imformation_schema。show engine innodb status 仅包含了 InnoDB 存储引擎的部分锁信息,但不会告诉你谁拥有锁。通过imformation_schema 可以高效和全面定位到谁阻塞和谁在等待,以及等待多久的查询。
本章节主要讲述如何在Mac系统上面安装Sublime Text编辑器。Mac上安装编辑器依旧不难,下载安装即可使用,只需要确保自己的电脑IOS版本大于10.7即可,这一点官网上也有介绍。当然了,我会告诉大家如何查看自己电脑系统的版本号,确保不会出现下载错误的情况。让我们先看一段安装视频教程:113
本章节带着大家模拟一下 Spirng 加载文件的过程和实例化对象的过程,当然这个过程只是模拟 Spring 的框架的思路,而并不是真正的 Spring 框架源码,实际源码远比这个要复杂的多,那么通过本章节我们收获哪些知识呢?Spring 容器类的使用 xml 配置文件的作用反射技术的应用我不相信不劳而获,如果有谁告诉你,他可以做到 XX 速成,请远离他,他连基本的诚信都没有…
作为一个知名的安全管理框架, Spring Security 对安全管理功能的封装已经非常完整了。我们在使用 Spring Security 时,只需要从配置文件或者数据库中,把用户、权限相关的信息取出来。然后通过配置类方法告诉 Spring Security , Spring Security 就能自动实现认证、授权等安全管理操作了。系统初始化时,告诉 Spring Security 访问路径所需要的对应权限。登录时,告诉 Spring Security 真实用户名和密码。登录成功时,告诉 Spring Security 当前用户具备的权限。用户访问接口时,Spring Security 已经知道用户具备的权限,也知道访问路径需要的对应权限,所以自动判断能否访问。
设置好文件名后,就可以下载导出 Excel 了: $file = "学生信息".date('YmdHis').".xlsx"; $writer = new Xlsx($spreadsheet); header('Content-Disposition: attachment;filename='.$file);//告诉浏览器将输出文件的名称 header('Cache-Control: max-age=0');//禁止缓存 $writer->save("php://output");;
Eclipse 编辑器默认就提供了对于输入代码过程的分析功能,编辑器可以通过 Java 语法来分析我们的代码从而给我们对应的提示。Eclipse 中的错误提示大致可以分为两类:警告(黄色)错误(红色)下面我们来看看在编写代码时 Eclipse 是如何给予我们警告和错误提示的,如下图所示:我们可以看到 Eclipse 就是使用黄色来表示警告信息,红色标识错误信息的,同时所有有问题的信息都会被收集显示在下方的 Problems 视图中。
我们添加一个配置类,专门用于配置 Swagger2 相关功能,这样比较清晰点。通过 @EnableSwagger2 注解开启 Swagger2 功能,通过 @Bean 标注的方法将对 Swagger2 功能的设置放入容器。实例:@Configuration // 告诉Spring容器,这个类是一个配置类@EnableSwagger2 // 启用Swagger2功能public class Swagger2Config { /** * 配置Swagger2相关的bean */ @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com"))// com包下所有API都交给Swagger2管理 .paths(PathSelectors.any()).build(); } /** * 此处主要是API文档页面显示信息 */ private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("演示项目API") // 标题 .description("学习Swagger2的演示项目") // 描述 .termsOfServiceUrl("http://www.imooc.com") // 服务网址,一般写公司地址 .version("1.0") // 版本 .build(); }}
打开 prometheus web UI 页面 http://127.0.0.1:9090,点击 alert 标签页,查看监控告警状态:我们将监控的容器 cadvisor 关掉。docker stop cadvisor几秒后刷新页面,发现告警进入 Pending 暂挂状态:一分钟后(rule_1.yml 中 for = 1m 配置)告警进入 firing 状态。查收告警邮件:修复故障后恢复正常:docker start cadvisor
警告框在 demo 和调试过程中比较常用。window.alert('弹出!');alert 方法接受一个参数,即要提示的内容。警告框没有其他交互,只有单纯的提示作用。因为警告框长得不是很好看,在各个浏览器下的样式也不统一,所以正式产品很少会用到。
Maven 的默认配置中,会在 target\surefire-reports 目录下生成测试报告。我们执行 mvn clean test,就可以观察到该目录生成。我们可以在 txt 格式的文档中看到生成的测试报告。这里的测试报告基本上和控制台输出的内容是类似的。大家可能也注意到了,我们在执行测试用例的时候,同时生成了两种类型的文件,一种是 txt 格式,另一个则是 XML 格式。txt 格式: 为了让执行测试用例的开发者更加直观的看到测试用例的运行结果;XML格式: 更多的是为了支持其他工具的解析。
Transfer Encode 告诉服务端自己能够处理的传输编码。
核心功能非常强大,也是编辑器的一大亮点,熟悉了之后将会事半功倍一些核心功能:GoTo Anything:顾名思义就是去任何一个文件,还可以跳转到指定行数,单词等,只要你想就可以做到;GoTo Definition:同理就是定位到事先定义的某个函数,类,方法,谁用谁知道;Multiple Selections:意思是多重选择,在你需要一次性修改多处一样的变量的时候,你就知道这个功能的强大;Command Palette:这个就是命令面板,里面是一些使用频率不高的操作或者快速搜索某个操作;Powerful Api And Package Ecosystem:Sublime 编辑器的火爆离不开强大的生态圈和 api,比如代码高亮,代码补全,编辑 markdown 等等;……由于篇幅限制,我们仅演示 Goto Anything 功能,GoTo > Goto Anything,或者快捷键 Ctrl + P,然后模糊搜索即可,如下图:
在食用指南中我们说到了学习本课程需要具备一些 HTML/CSS/JS 基础,那么下节课《Web 相关知识 - HTML/CSS/JS》中我们就来介绍一下本课程中需要用到的 HTML/CSS/JS 知识。
错误报告包含设备日志、堆栈轨迹和其他诊断信息,可以帮助我们查找和修复应用中的错误。我们可以通过以下几种方式从设备上获取错误报告。
除了 HTML/CSSJS 的知识外,学习 Web 开发还需要对 HTTP 协议有一定的了解,HTTP 协议同样是 Web 开发必备基础知识,下节课我们就来学习下 HTTP 协议以及 HTTP 在 Web 开发中所起到的作用。不仅如此,下节课会给给大家进行一个 Web 开发常见概念的普及,让大家对 Web 开发有一个更清晰的了解。
告诉客户端他们的 POST 或者 PUT 请求无法被成功,可能是因为传输的实体太大,服务端的磁盘有限。
告诉客户端连接的网络需要认证,可能所连接的 Wi-Fi 还没经过认证。
默认情况下,错误报告是 ZIP 文件。ZIP 文件名类似 bugreport-BUILD_ID-DATE.zip,它可能会包含多个文件,但最重要的文件是 bugreport-BUILD_ID-DATE.txt。此文件就是错误报告,它包含系统服务 (dumpsys)、错误日志 (dumpstate) 和系统消息日志 (logcat) 的诊断输出。系统消息包括设备抛出错误时的堆栈轨迹,以及从所有应用中使用 Log 类写入的消息。ZIP 文件中有一个 version.txt 元数据文件,其中包含 Android 版本号,而且启用 systrace 后,ZIP 文件中还会包含 systrace.txt 文件。Systrace 工具可以获取并显示应用进程和其他 Android 系统进程的执行时间,从而帮助分析应用的性能。dumpstate 工具会将文件从设备的文件系统复制到 ZIP 文件的 FS 文件夹下,以便我们引用它们。例如,设备中的 /dirA/dirB/fileC 文件会在 ZIP 文件中生成 FS/dirA/dirB/fileC 条目错误报告文件结构如下:
坐标有了之后,说明我们的工程中已经引入了 Spring 框架的依赖。小伙伴可以检查下是否正确,点开左侧的 External Libraries 查看一下 。那么看到上面的 jar 包列表,表示 Spring 框架中的基本依赖我们已经成功引入。接下来:既然我们使用的是框架,框架是一个半成品,已经封装好了很多功能提供我们使用,而我们如何让他们工作呢? 这里需要一个和 Spirng 框架通信的桥梁 —Spring 框架的核心配置文件。小提示:文件的名称你们可以随便起,我习惯使用 applicationContext.xml。文件的位置放在哪里呢? maven 工程需要放在 src 下面的 resources 下面,如下图:那么配置文件是空的,不要着急。到底应该配置什么,不是自己臆想猜测的。如果你已经下载了源码,那么解压缩它,打开 docs\spring-framework-reference 目录,打开 core.html 查看官方文档,已经给了说明书你不看,你赖谁? 不知道怎么看?下图告诉你:将上面的实例配置信息拷贝到我们的配置文件中,它只是给了最基本的配置头信息,内容部分 针对 bean 做初始化的部分 需要我们自行填充 。
不难证明,外卖和我们的生活越来越紧密,我们也许天天都点外卖,那有没有想过,为什么我们敢把自己的姓名、身份证、手机、银行卡、家庭住址等等一系列敏感信息都放心地告诉给第三方平台?这离不开一个词「信任」。当我点了一单外卖,为什么饭店看得到我的订单?为什么配送员可以找得到我家?为什么客服中心可以处理投诉?为什么财务人员可以划拨?这里又出现了另一个词「职责」。所谓「信任」,就是我知道你是谁,我也相信你做的事;所谓「职责」,就是我们相互独立又共同协作。在 IT 系统中,「信任」是通过「认证」来完成的,「职责」是通过「权限」来实现的,它们又被统称为「应用安全」。可见,「安全」是 IT 系统正常运营的必要条件之一。既然「安全」如此重要,那有没有一套框架可以帮助 Spring Boot 开发者快速地、规范地、有效地构建自己 IT 系统的安全环境呢?当然有,那就是本次课程的主题:「Spring Security」安全框架。
自定义类型处理器无法直接被 MyBatis 加载,我们需要增加相关的配置告诉 MyBatis 加载类型处理器。
由上面的本质区别分析,严格按照协变点、逆变点规则来是不能完全满足我们真实开发需求场景的,所以有时候需要一道后门,那就要用特殊方式告诉它。那就是使用 UnSafeVariance 注解。所以 UnSafeVariance 注解作用很简单: 通过 @UnSafeVariance 告诉编译器该处安全性自己能够把控,让它放你编译通过即可,如果不加编译器认为这是不合法的。注解的意思就是不安全的型变,例如在协变泛型类中有个函数是以传入一个该泛型形参的函数形参的,通过 UnSafeVariance 注解让编译器闭嘴,然后把它放置在逆变点实际上是增加一层危险性,相当于把这层危险交给了开发者,只要开发者能保证内部不存在危险性操作肯定就是安全的。
系统初始化时,告诉 Spring Security 访问路径所需要的对应权限,所以我们开发从数据库获取权限列表的方法。实例:@Repositorypublic class ApiDao { @Autowired private JdbcTemplate jdbcTemplate; /** * 获取所有api */ public List<String> getApiPaths() { String sql = "select path from api"; return jdbcTemplate.queryForList(sql, String.class); }}登录时,告诉 Spring Security 真实用户名和密码。 登录成功时,告诉 Spring Security 当前用户具备的权限。所以我们开发根据用户名获取用户信息和根据用户名获取其可访问的 api 列表方法。实例:@Repositorypublic class UserDao { @Autowired private JdbcTemplate jdbcTemplate; /** * 根据用户名获取用户信息 */ public List<UserDo> getUsersByUsername(String username) { String sql = "select id, username, password from user where username = ?"; return jdbcTemplate.query(sql, new String[] { username }, new BeanPropertyRowMapper<>(UserDo.class)); } /** * 根据用户名获取其可访问的api列表 */ public List<String> getApisByUsername(String username) { String sql = "select path from user left join roleapi on user.roleId=roleapi.roleId left join api on roleapi.apiId=api.id where username = ?"; return jdbcTemplate.queryForList(sql, new String[] { username }, String.class); }}
就是在页面上加入了这么一个动态的效果,页面才不会显得那么平静如水。有趣的交互效果能让你的页面熠熠生辉、锦上添花。但并不是所有雪碧图的尺寸都能这么完美的贴合元素,下一小节我们将告诉大家应该如何调节背景图片的大小以适应页面元素。
下面,使用纯 JAVA 方式为 Spring MVC 的初次运行提供必备的配置信息 。先认识一个组件,做好思想准备,这个组件名字很长,别吓到你了:AbstractAnnotationConfigDispatcherServletInitializer。名字虽然有点长,但是很体贴,怕你不知道它的作用,名字本身就告诉了你:基于注解的初始化 DispatcherServlet 的抽象组件,简单说就是一个 WEB 初始化组件,用来替代 web.xml 的功能。该动手了!构建一个继承了AbstractAnnotationConfigDispatcherServletInitializer 的类:package com.mk.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{ @Override protected Class<?>[] getRootConfigClasses() { return null; } @Override protected Class<?>[] getServletConfigClasses() { return null; } @Override protected String[] getServletMappings() { return null; }}嘿!居然有 3 个方法强制性要求实现,那么,这 3 个方法分别是干嘛用的?WebInitializer 这个类会自动创建 Spring MVC 的 DispatcherServlet 核心组件,并且创建 2 个 WebApplication 上下文对象。Spring 不能白学,是吧,工厂再厉害,你也得告诉它你要创建什么吧。大家还记得这些信息你原来是放在哪里的吗?想起来了吧,你是放在 XML 文件中的,本文则是放在 JAVA 类中。所以这 3 个方法中有 2 个方法是用来指定这 2 个上下文对象分别对应的配置类是谁。知道原因了,立马准备好 2 个配置类。//web 上下文对象的配置类@Configuration@ComponentScan(basePackages = { "com.mk.web" }, excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class) })public class RootConfig {}// Root 上下文对象的配置类@Configuration@EnableWebMvc@ComponentScan(basePackages = { "com.mk.web.action" })public class WebConfig {}这里有 3 个注解需要说明 一下:@Configuration 注解:说明这个类是配置类;Tips: 配置类用来替代 XML 配置文件。@EnableWebMvc 注解: 很好理解,启动 Spring MVC 相关功能;@ComponentScan 注解: 指定上下文对象各自负责的组件所在包。Tips: Root 配置类中需要排除 Web 配置类负责的区域。在重新完善 WebInitializer 类之前,说明一下,另一个方法是用来指定前端控制器可以响应的请求地址。OK!让我们再来看看这 3 个方法本来应该的样子:@Overrideprotected Class<?>[] getRootConfigClasses() { return new Class[] { RootConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[] { WebConfig.class};}//接受所有请求@Overrideprotected String[] getServletMappings() { return new String[] {"/"};}
告诉服务器自己要访问的的服务域名信息,有可能一台服务器绑定了多个不同域名,并且不同域名对应了不同服务。Host: www.imocc.com
可能会有较真的同学问:我仔细看了 SVG 图片,图片边缘依然还是有“锯齿”啊。这里我要告诉大家的是:毕竟 SVG 也是要显示在屏幕上的,屏幕也是有像素限制的,比如比较流行的 1920 * 1080。如果换一台苹果电脑的 5K 显示屏,可能就看不到“锯齿”啦。
2.2.1 Android 包名错误Android 包名要用 . 至少分为两段,并且每段开头必须是小写字母,比如 imooc.project 是对的,但是 imooc.123.project 是错的。2.2.2 出现红色警告错误出现下面的红色警告标志就说明当前页面有错误,这时点击打包按钮没有反应,要先解决掉错误才能点击打包按钮。2.2.3 出现打包校验错误出现下面的警告,我们需要点击截图中的第一个链接,补充绑定自己的手机号等信息。2.2.4 appid 为空打包时报下面的错误,是因为 Manifest.json 文件中没有填写 appid。HBuilderX 会自动帮我们打开 Manifest.json 文件,在 appid 那一行的后面点击重新获取就可以了。
本节的内容可能有些抽象,别担心,到这里还不需要大家理解容器具体内容,本节最大的意义在于告诉大家以下两点:不要把 Docker 的概念与容器技术概念混淆,他们并不是等价的;容器的本质是一个进程。
建议去官网下载, 地址:Sublime 下载不建议去其他网站下载编辑器,可能会带有广告,甚至病毒。