-
Notifications
You must be signed in to change notification settings - Fork 0
/
Blog.sql
executable file
·113 lines (81 loc) · 300 KB
/
Blog.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
SQLyog Enterprise Trial - MySQL GUI v7.11
MySQL - 5.7.19-log : Database - Blog
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`Blog` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `Blog`;
/*Table structure for table `blog` */
DROP TABLE IF EXISTS `blog`;
CREATE TABLE `blog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(200) NOT NULL,
`summary` varchar(400) DEFAULT NULL,
`releaseDate` datetime DEFAULT NULL,
`clickhit` int(11) DEFAULT NULL,
`replyhit` int(11) DEFAULT NULL,
`context` text,
`typeid` int(11) DEFAULT NULL,
`keyword` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `key_` (`typeid`),
CONSTRAINT `key_` FOREIGN KEY (`typeid`) REFERENCES `blogtype` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;
/*Data for the table `blog` */
insert into `blog`(`id`,`title`,`summary`,`releaseDate`,`clickhit`,`replyhit`,`context`,`typeid`,`keyword`) values (1,'SSM框架整合','spring约束1.bean约束{ <?xml version=\"1.0\" encoding=\"UTF-8\"?> <beans xmlns=\"http://www.springframework.org/schema/beans\" xmlns:xsi=\"http://www.w3.org/20','2017-12-18 13:47:19',3,1,'<p style=\"white-space: normal;\"><span style=\"font-size: 24px;\">spring约束</span><br/></p><p style=\"white-space: normal;\"><span style=\"font-size: 24px;\"></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">1.bean约束</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> <?xml version="1.0" encoding="UTF-8"?></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> <beans xmlns="http://www.springframework.org/schema/beans"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xsi:schemaLocation="</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/beans </span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/beans/spring-beans.xsd"></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">}</span></p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">2.bean注解约束</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> <?xml version="1.0" encoding="UTF-8"?></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> <beans xmlns="http://www.springframework.org/schema/beans"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xmlns:context="http://www.springframework.org/schema/context"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xsi:schemaLocation="</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/beans</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/beans/spring-beans.xsd</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/context </span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/context/spring-context.xsd"></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">}</span></p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">3.aop约束</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> <?xml version="1.0" encoding="UTF-8"?></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><beans xmlns="http://www.springframework.org/schema/beans"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xmlns:aop="http://www.springframework.org/schema/aop"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xsi:schemaLocation="</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/beans</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/beans/spring-beans.xsd</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/aop </span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/aop/spring-aop.xsd"></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">}</span></p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">4.web MVC注解开发</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> <?xml version="1.0" encoding="UTF-8"?></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> <beans xmlns="http://www.springframework.org/schema/beans"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xmlns:mvc="http://www.springframework.org/schema/mvc" </span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xmlns:context="http://www.springframework.org/schema/context"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xsi:schemaLocation="</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/beans</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/beans/spring-beans.xsd</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/context</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/context/spring-context.xsd</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/mvc</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/mvc/spring-mvc.xsd"></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">}</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 24px;\"></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 24px;\">mybatis配置映射文件需要的约束</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 24px;\"><br/></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 24px;\"></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> <?xml version="1.0" encoding="UTF-8" ?></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><!DOCTYPE mapper</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd"></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">}</span></p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">配置持久化配置文件</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><?xml version="1.0" encoding="UTF-8" ?></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><!DOCTYPE configuration</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> PUBLIC "-//mybatis.org//DTD Config 3.0//EN"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> "http://mybatis.org/dtd/mybatis-3-config.dtd"></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">}</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"></span><span style=\"font-size: 24px;\"><br/></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">spring-mybatis整合</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> ApplicationContext.xml</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> {</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><beans xmlns="http://www.springframework.org/schema/beans"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"></beans> </span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> }</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">}</span></p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">spring springMVC mybatis</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"> <?xml version="1.0" encoding="UTF-8"?></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><beans xmlns="http://www.springframework.org/schema/beans"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span>xmlns:mybatis="http://mybatis.org/schema/mybatis-spring" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span>xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span>xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span>xsi:schemaLocation="http://www.springframework.org/schema/beans </span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span> http://www.springframework.org/schema/beans/spring-beans-4.2.xsd</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span> http://www.springframework.org/schema/context</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span> http://www.springframework.org/schema/context/spring-context-4.2.xsd</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span> http://www.springframework.org/schema/mvc</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span> http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span> http://www.springframework.org/schema/tx</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span> http://www.springframework.org/schema/tx/spring-tx-4.1.xsd</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span> http://mybatis.org/schema/mybatis-spring </span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\"> </span> http://mybatis.org/schema/mybatis-spring.xsd "></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px;\">}</span></p><p><span style=\"font-size: 20px;\"><br/></span></p><p><br/></p>',6,'SSM 约束'),(2,'Tomcat服务器和servlet','tomcat目录结构bin 启动关闭Tomactconf 配置文件 server xml 该文件用于配置和server相关的信息 比如Tomcat启动端口后配置host web.xml 该文件配置与web应用相关(web应用相当于web站点) tomcat-users.xml 配置管理员权限','2017-12-18 13:50:26',3,0,'<p>tomcat目录结构</p><p>bin 启动关闭Tomact</p><p>conf 配置文件</p><p> server xml 该文件用于配置和server相关的信息</p><p> 比如Tomcat启动端口后配置host </p><p> web.xml 该文件配置与web应用相关(web应用相当于web站点)</p><p> tomcat-users.xml 配置管理员权限等等 </p><p> logs 用于储存服务器日志</p><p> webapps 用于存放web应用</p><p> </p><p>http://localhost:8080/web1/hello.html(整个是URL)</p><p>协议 主机(域名)端口 web应用 资源文件(URI)</p><p>决定路径:从根目录开始找</p><p>相对路径:从当前目录开始找</p><p><br/></p><p>servlet开发有三种方法</p><p>a.实现servlet接口</p><p>b.继承GenericServet</p><p>c.继承HttpServlet</p><p><br/></p><p>(指定编码格式的时候,可以用</p><p> response.setContentType("text/html;chartset = utf-8");</p><p><span class=\"Apple-tab-span\" style=\"white-space:pre\"> </span>response.setCharacterEncoding("UTF-8");</p><p><span class=\"Apple-tab-span\" style=\"white-space:pre\"> </span>这两种,第一种只对文本有用,<a><a>中间的文字不起作用,</p><p><span class=\"Apple-tab-span\" style=\"white-space:pre\"> </span>第二张都有用)</p><p><br/></p><p>1.实现servlet接口</p><p> { </p><p> 解析主机,解析web的时候,就会利用发射机制调用init函数来初始化servlet。</p><p> 然后每次服务器请求servlet的时候,就会调用service函数</p><p><br/></p><p> (1)需要实现5个函数 初始化函数,返回servlet信息函数,核心执行函数,清除内存函数,获取servletconfig对象函数</p><p> (2)在执行servlet之前 会在web.xml配置servlet</p><p> { </p><p> 注册servlet</p><p> <servlet></p><p> servlet的注册名</p><p> <servlet-name>给这个servlet取名字</servlet-name>(再再找有没有这个servlet)</p><p><span class=\"Apple-tab-span\" style=\"white-space:pre\"> </span>servlet包路径</p><p><span class=\"Apple-tab-span\" style=\"white-space:pre\"> </span><servlet-class>servlet的路径 有包就写包名 不用加.Java</servlet-class>(最后看路径在哪里)</p><p> </servlet></p><p> servlet的映射(一个servlet可以有多个映射)</p><p> <servlet-mapping></p><p><span class=\"Apple-tab-span\" style=\"white-space:pre\"> </span>servlet注册名</p><p><span class=\"Apple-tab-span\" style=\"white-space:pre\"> </span><servlet-name>应该和上面的name一样,根据这个名字寻找</servlet-name>(再看servlet的名字)</p><p><span class=\"Apple-tab-span\" style=\"white-space:pre\"> </span>servletURL地址</p><p><span class=\"Apple-tab-span\" style=\"white-space:pre\"> </span><url-pattern>访问servlet的资源名</url-pattern>(先寻找资源名)</p><p><span class=\"Apple-tab-span\" style=\"white-space:pre\"> </span></servlet-maping></p><p> }</p><p> </p><p> service核心执行函数</p><p> {</p><p> 参数:servlerequest 用于接受请求 servletresponse rep 用于返回信息 rep.getwrite().println()</p><p> 可以写到浏览器中</p><p> 当servlet被调用的时候,会把调用者或访问者的IP还有等等信息封装到response对象里。</p><p> 每次浏览器请求服务一次,servlet就响应一次。</p><p> }</p><p><br/></p><p> servlet的生命周期;</p><p> 当第一次调用servlet的时候就会调用一次init函数,初始化servlet。</p><p> 初始化过后,无论是重启浏览器还是刷新,init函数都不会再调用了。</p><p> 而如果reload服务器或者web应用停止运行,就会调用destroy函数从内存中清除</p><p> servlet对象。再启动就要调用init函数了,所以servlet是一个单例对象。</p><p> </p><p>}</p><p><br/></p><p>2.GenericServet继承</p><p> {</p><p> 这需要重写service函数</p><p> }</p><p><br/></p><p>3.httpservlet继承</p><p> {</p><p> 有两个函数doget,dopost;</p><p> 在HTML表单里面,有两个传输方式:get post</p><p> 1.get会把内容显示在URL上,而post不会</p><p> 2.提交内容get<post get内容限制2k 而post不受限制 但最好不要大于64k</p><p> 3.提交速度get>post get是立刻处理,而post会形成一个队列,所以会慢一些</p><p> }</p><p>4.servlet跳转技术有两种</p><p>(1)Sendredirect 转向</p><p><br/></p><p>(2)forward下一个</p><p><br/></p><p>网站结构</p><p>{</p><p> MVC</p><p> {</p><p> model:业务逻辑层,包括工具类,业务类</p><p> 工具类用于常用代码</p><p> 业务逻辑类用于接收用户处理请求</p><p> view:界面层,用于显示界面。</p><p> controller:控制层,用于决定跳转哪个页面,接收用户请求在转发</p><p> 给model层处理,一类事物对应一个控制器即可,删除用户,删除任务对应一个控制器</p><p><br/></p><p><br/></p><p> 例如:显示用户信息,界面层接收用户请求,界面层转发请求到用户对应的业务逻辑层</p><p> 业务逻辑层组织好SQL语句,调用SQLhelper处理,返回结果到界面层。</p><p><br/></p><p> }</p><p> 数据库对象</p><p> {</p><p> 每个数据库表对应一个对象</p><p> 查询完成后,不需要返回resultset对象,那resultset对象存到一个对应表</p><p> 中,然后放入到arraylist中再返回</p><p> resultset->表对象->arraylist</p><p> }</p><p>}</p><p><br/></p>',8,'Tomcat Servlet'),(3,'Spring','spring{ 1.AOP编程:面向切面编程 2.IOC编程:控制反转,有个类想调用他的非静态方法,就需要创建一个 类才可以调用,控制反转就可以把new一个类交给spring配置对象 3.一站式编程}IOC{ 1.XML配置文件 <bean id = \"user\" class = \"com.asd.','2017-12-18 13:51:43',0,0,'<p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">spring</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.AOP编程:面向切面编程</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.IOC编程:控制反转,有个类想调用他的非静态方法,就需要创建一个</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 类才可以调用,控制反转就可以把new一个类交给spring配置对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.一站式编程</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">IOC</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.XML配置文件 <bean id = "user" class = "com.asd.user"/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.dom4j解决XML:dom4j解读XML文件得到类路径</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.工厂设计模式 利用反射:Class class = Class.forName("解读出来的类名");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.反射 user user = class.newInstance();</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">(做XML的IOC时应该添加约束)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">耦合度:关联度</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">bean实例化的三种方法</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.使用类的无参数构造创建</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <bean id = "" class = ""></bean> 如果没有无参构造器就会出错</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.使用静态工厂创建</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 使用一个静态方法创建一个对象,并返回</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <bean id = "bean2" class = "com.spring2.factory" factory-method = "getbean2"></bean></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.使用实例工厂创建</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <bean id = "factory" class = "com.spring2.factory"></bean></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <bean id = "bean" factory-bean = "factory" factory-method = "getbean2"></bean></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">bean标签常用属性</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.id:其名称,ID属性任意命名</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 根据ID值得到配置对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.class:创建类的全路径</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.name:也是名称,和ID值功能,不常用</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.scope:用于设置bean的作用范围</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> singleton:默认值,单例,不写就是默认</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> prototype:多例的</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> request:web项目中,spring创建一个bean对象,将对象存到request作用域中</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> session:web项目中,spring创建一个对象并将对象存到session域中</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">获取spring配置文件bean.xml的两个方法</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.ApplicationContext context = new ClassPathXmlApplicationContext("been.xml");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果在xml文件里面,scope的类型是singleton,那么,调用这个函数就会把bean里面的类</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 装载并实例化到applicationcontext容器里面,就是new到这个容器里面。但是如果scope</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 属性换成prototype,那调用这个函数就不会实例化了,只是会装载到这个容器里面而已,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 而另外一个request相当于prototype,global session就相当于singleton。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.BeanFactory beanFactory = new XmlBeanFactory(new ClassPathXmlApplicationContext());</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> bean工厂方法。这个方法无论类型是什么,他都不会实例化,只是会加载到工厂里面并不会new实</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 例化到工厂里面。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">bean的生命周期</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.实例化一个对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.调用set方法注入属性</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.调用BeanNameAware(),调用里面的方法可以看到正在装载的beanID号</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.调用BeanFactoryAware(),实现接口并调用里面方法可以看到bean工厂</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 5.接着调用BeanPostProcessor的预初始化方法</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 6.接着调用BeanPostProcessor的后初始化方法</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 7.使用</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 8.容器销毁</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 9.调用disposablebean的destroy方法</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">属性注入</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.使用set方法注入属性(spring有)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <bean id = "bean" class = "com.spring2.bean" scope="prototype"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="userString" value="day"></property></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </bean> property中的name的名字应该是类里面的变量的名字 value是要输入的值</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.使用有参数的构造方法(spring有)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <!-- 使用静态方法创建对象 --></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <bean id = "bean" class = "com.spring2.bean" scope="prototype"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <constructor-arg name = "username" value = "小王"></constructor-arg></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </bean></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.使用接口注入(spring无)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.p名称空间注入(spring有)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> xmlns:p="http://www.springframework.org/schema/p"</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <bean id="dao" class="com.spring2.dao" p:nameString = "name" p:mynameString="namestring"></bean></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">注入一个对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> userservice的一个成员类型是dao类型</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 注入dao。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <bean id = "dao" class = "com.spring2.dao"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="nameString" value = "name"></property></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="mynameString" value = "namestring"></property></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </bean> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <bean id = "user" class="com.spring2.userservice"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="dao" ref = "dao"></property></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </bean></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">注入复杂对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 注入数组,map,等等</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="arrs"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <list></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <value>a</value></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <value>b</value></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <value>c</value></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </list></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </property></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="list"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <list></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <value>d</value></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <value>e</value></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <value>f</value></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </list></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </property></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="map"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <map></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <entry key = "aa" value = "g"></entry></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <entry key = "bb" value = "h"></entry></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <entry key = "cc" value = "i"></entry></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </map></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </property></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="properties"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <props></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <prop key="driverclass">com.mysql.jdbc.driver</prop></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </props></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </property></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">IOC和DI</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> IOC:控制反转,把对象创建交给spring</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> DI: 依赖注入,依赖注入必须依赖IOC控制反转,向类中设置值:property标签</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">spring整合web项目</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.把加载文件和创建对象过程,在服务器启动的时候完成</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.原理:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.ServletContext对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.监听器</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 实现:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> ServletContext是服务器公用对象,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 每个项目在创建的时候,都会创建一个</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> ServletContext对象。使用监听器可以</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 知道servletcontext在什么时候被创建</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 在监听到创建servletcontext对象被创建的时候</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 就加载资源文件,把创建出来的对象放到servletcontext域对象里面</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> setattribute</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 要拿出来就用getattribute</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">注解创建对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{ </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 0.需要添加 <context:component-scan base-package="com.spring3"></context:component-scan></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 标签,意思是扫描com.spring3的包,约束的话去HTML找context包</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1. @Component(value="user")//类似于<bean id......</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">public class userservice {</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4种注解</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.component:组件都可以用</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.control:控制层用</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.service:业务逻辑层</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.repository:持久层</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 功能作用都一样</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 确定单还是多实例</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> @scope(value = "prototype")</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.引入属性</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果service类定义了一个类作为成员变量</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> service类:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> @Autowired(少用)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> public missiondao missiondao = null;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> @Resource(name = "missiondao")(多用)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> public missiondao missiondao = null;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 成员变量类:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> @Component(value="missiondao")</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> public class missiondao {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">AOP概念</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.面向切面编程,扩展功能不通过修改源代码来改变</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 以前的扩展功能是通过纵向抽取解决,即继承父类的方法并调用</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.面向横向编程,创建一个接口然后实现。或者使用动态代理,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 创建一个和原类平级的一个对象,这个对象不是真正的对象,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 代理对象,和原对象有一样的功能</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.spring的aop代理默认使用jdk的动态代理创建,如果需要代理的类不是</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 代理接口类的时候,会切换回cglib代理</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">aop术语</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.joinpoint(连接点):类里面那些方法可以被增强,这些方法就称为连接点</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.pointcut(切入点):实际要增强的方法是哪些</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.advice(通知增强):扩展的实际功能</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 前置通知:方法之前执行</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 后置通知:方法之后执行</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 异常通知:方法出现异常</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 最终通知:再后置通知之后执行</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 环绕通知:在方法之前执行,在方法之后执行</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.introduction(引介);可以动态的为类添加属性</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 5.target(目标对象):代理的目标,即代理的类</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 6.weaving(织入)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 7.proxy(代理)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 8.aspect(切面):把增强增加到切入点的过程</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">AOP操作</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 使用aspectj进行aop操作</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.aspectj进行XML配置操作</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.aspectj注解</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.配置切入点(要增强的方法是哪些)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 表达式</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> execution(<访问修饰符>?<返回类型><方法名>(<参数类型>)<异常>)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.execution(* com.mission.add(...))(访问修饰符后面一定要加空格)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.execution(* com.mission.*(...))</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.execution(* *.*(...))</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.execution(* save*(...))()</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.aop通过文件方式</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <!-- 配置aop --></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <aop:config></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <!-- 配置切入点 --></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <aop:pointcut expression="execution(* com.spring3.mission.*(..))" id="pointcut"/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <!-- 配置切面 --></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <aop:aspect ref="missiondao"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <aop:before method="bigger" pointcut-ref="pointcut"/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </aop:aspect></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </aop:config></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.注解方式进行aop操作</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> @Before:前置增强</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> @AfterReturning:后置增强</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> @Around:环绕增强</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> @AfterThrow:抛出</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> @Before("execution(* com.spring3.mission.*(..))")</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> public void bigger() {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> System.out.println("前置对象");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">spring DAO jdbcTemplate(jdbc模板处理)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 配置数据源</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> XML配置文件</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <!-- 配置数据源 --> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <bean id="dataSource" </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> class="org.springframework.jdbc.datasource.DriverManagerDataSource"> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="url" value="jdbc:mysql://localhost:3306/test" /> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="username" value="root" /> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="password" value="christmas258@" /> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </bean> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <!--配置一个JdbcTemplate实例,并将这个“共享的”,“安全的”实例注入到不同的DAO类中去 --> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="dataSource" ref="dataSource" /> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </bean> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 可以把数据库的内容查找出来之后进行封装成一个对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 可以继承一个 RowMapper<Student>借口</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 例如:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> public class StudentMapper implements RowMapper<Student>{ </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> public Student mapRow(ResultSet rs, int rowNum) throws SQLException { </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Student student = new Student(); </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> student.setId(rs.getInt("id")); </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> student.setName(rs.getString("name")); </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> student.setAge(rs.getInt("age")); </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> student.setSex(rs.getString("sex")); </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> return student; </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> } </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> } </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">springMVC原理</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.用户加载页面或者是按下按钮,都是一个http请求,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 这个请求将会交给MVC的一个叫做dispacherservlet的</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 分配器,这个是springMVC主要组件;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.dispacherservlet接收请求后会根据URL映射到一个</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 处理器映射器,映射器返回一个处理器handle给dispacherservlet</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.dispacherservlet根据这个返回的处理器找到handle,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 交给handle处理;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.handle处理完了返回一个 modelandview对象给dispacherservlet</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 5.dispacherservlet接收modelandview对象后,交给视图解析器</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 处理,视图解析器返回一个view视图;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 6.dispacherservlet接收到view视图反馈给用户;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">springMVC</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> mapping映射器</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.simplecontrollerhandleradapter</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 要求编写的handle实现controller接口,有modelandview返回值</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.httprequesthandleadapt要求编写</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> handle实现HTTPrequesthandle接口,无返回值,需要用request</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 转向来实现跳转;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.如果是使用HTML里面的<a>进行页面跳转,这个是属于重定向。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 既然是重定向,就会重新经过web.xml和{分配器名字}-servlet.xml,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 双层检测。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.如果是转向,就只需要进过一个分派器即可。</span></p><p><br/></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 映射器请求方法所允许返回的类型</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.modelandview</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.Model</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.Map<k,v></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.View</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 5.string</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 6.HttpEntity或ResponseEnity</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 7.Callable</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 8.DeferredResult</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 9.void</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> ModelAttribute</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> public String showlist(@ModelAttribute department department)</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 虽然department不是规定的返回对象,但是加上modelattribute注释后</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 会自动将department加入到request域对象中 integer这样的不能加上,string也不可以</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> modelandview和model</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果是modelandview,一定要返回modelandview,否则接收不到,可以处理器里面new一个新的。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果是model就不用返回,因为model没有设置URL的方法,model不能在处理器里面new新的,只能传</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">springMVC文件上传</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 控制器</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>@RequestMapping(value="file",method=RequestMethod.POST)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>public String file(Model model,@RequestParam(value="file") MultipartFile image,HttpServletRequest request) throws IllegalStateException, IOException</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>String path = request.getServletContext().getRealPath("/images/");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>System.out.println(path);</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>String filename = image.getOriginalFilename();</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>java.io.File filepath = new java.io.File(path, filename);</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>if(!filepath.exists())</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>filepath.mkdirs();</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>model.addAttribute("emps", new emps());</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>image.transferTo(new java.io.File(path+java.io.File.separator+filename));</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>return "/add";</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> servlet.xml配置文件</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <bean id = "multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="maxUploadSize"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <value>1048576</value></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </property></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <property name="defaultEncoding"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <value>UTF-8</value></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </property></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </bean></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">如果requestmapping注释分方法的参数不是可允许的参数,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">就要用modelattribute注解,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">意思是加入到request域中,默认也是加到request域中。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">比如返回一个integer </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">不是可允许的,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">就要用modelattribute注解</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">spring整合mybatis</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.mybatis的SQL语句如果是静态的使用注解配置</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果是动态的使用XML语句配置</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.获取spring-bean的配置文件一般使用spring的核心监听器来指定加载配置文件</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.web.xml的URL过滤,如果是全过滤就要考虑到静态网页无法显示的问题,需要配置</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 静态处理器。如果写上.mvc .action .do这些,在提交或跳转就要写上.mvc .action</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> .do,否则会默认静态网页直接查找</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">@Qualifier注解</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果有多个类实现了同一个接口,就需要用@Qualifier指定自动装配哪个</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">如果使用伪静态HTML。也就是.html,会默认TEXT格式,使用ajax接收返回json数据将无效</span></p><p><br/></p>',3,'spring IOC AOP'),(4,'Shiro','shiro{ shiro基本功能 1.Authentication:登录验证 2.Authorization:用户授权 3.Session manager:会话管理 4.Cryptography:加密 5.web support:web服务支持 6.testing:测试 7.r','2017-12-18 13:53:03',2,0,'<p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">shiro</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> shiro基本功能</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.Authentication:登录验证</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.Authorization:用户授权</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.Session manager:会话管理</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.Cryptography:加密</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 5.web support:web服务支持</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 6.testing:测试</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 7.remenber me:记住用户</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> shiro组件</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.subject:登录主体,可以是一个用户,一个机器人或爬虫。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.securityManager:是shiro核心,类似springMVC的dispacherservlet,所以的交互都会经过</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.Authenticator:认证器,用于确认是否登录进来</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.Authrizer:授权器,用户授权</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 5.realm:实体数据域,用于获取密码这些</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 6.sessionmanager:用于实现分布式会话</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 7.sessionDao:用于会话的CRUD</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 8.CacheManager:缓存控制器</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 9.cryptography:加密</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> shiro认证流程</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.获取身份凭证,得到securitymanager实例,全局变量只需要设置一次</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.通过securityUtil获取subject并且绑定当前实例</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.login登录</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.loginout退出</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 身份认证</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.先要委托给securitymanager,自动委托之前要通过securityutil设置securitymanager</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.securitymanager会进行正在的身份逻辑验证,委托给Authenticater认证器认证</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.认证器会委托响应的AuthenticationStrategy策略进程认证</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.Authenticater把相应的taken传入realm进行验证</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> realm</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.inirealm:[user]指定用户名密码及权限,[roles]指定用户角色</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.PropertiesRealm: user.username=password,role1,role2指定用户名/密码及其角色;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> role.role1=permission1,permission2指定角色及权限信息;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.jdbcrealm:通过SQL查询信息</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 认证策略</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.FirstSuccessfulStrategy:只要有个认证成功就成功,只是会返回第一个认证成功的的信息</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.AtLeastOneSuccessfulStrategy:只要有一个成功就算成功,返回所有认证成功的realm,默认这个</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.AllSuccessfulStrategy:所有的realm成功才是成功,返回所有成功的realm</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 授权流程</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> { 0.会调用wildpermittedresolver解析ini文件得到文件里面的权限,并封装成一个permitter对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.在调用ispermitted之前会委托给securitymanager,securitymanager会委托</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Authorizer判断</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.authorizer是真正的授权者,调用ispermitted("user:update")会先把</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 字符串构造成一个permitted对象。在2调用permitter接口的impliming函数比较</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> (realm会实现AuthenticatingRealm接口,两个doget函数一个授权一个认证)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.在调用授权之前会调用realm获取subject获取权限与传入的权限的匹配</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.Authorizer会判断是否realm角色是否与传入的角色匹配,如果多个会调用</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> ModularRealmAuthorizer进行循环判断。</span></p><p><br/></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> ini文件设置securitymanager.realm一定要放在最后。</span></p><p><br/></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 配置ini文件</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> [main] </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>#authenticator </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>authenticator.authenticationStrategy=$authenticationStrategy </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>securityManager.authenticator=$authenticator </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>#authorizer </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>authorizer=org.apache.shiro.authz.ModularRealmAuthorizer </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>permissionResolver=org.apache.shiro.authz.permission.WildcardPermissionResolver </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>authorizer.permissionResolver=$permissionResolver </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>securityManager.authorizer=$authorizer </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>#realm </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>dataSource=com.alibaba.druid.pool.DruidDataSource </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>dataSource.driverClassName=com.mysql.jdbc.Driver </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>dataSource.url=jdbc:mysql://localhost:3306/shiro </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>dataSource.username=root </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>#dataSource.password= </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>jdbcRealm.dataSource=$dataSource </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>jdbcRealm.permissionsLookupEnabled=true </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>securityManager.realms=$jdbcRealm</span></p><p><span style=\"white-space: pre; font-family: 黑体, SimHei; font-size: 20px;\"> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>基本配置</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>[main] </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>#提供了对根对象securityManager及其依赖的配置 </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>securityManager=org.apache.shiro.mgt.DefaultSecurityManager </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>………… </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>securityManager.realms=$jdbcRealm </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>[users] </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>#提供了对用户/密码及其角色的配置,用户名=密码,角色1,角色2 </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>username=password,role1,role2 </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>[roles] </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>#提供了角色及权限之间关系的配置,角色=权限1,权限2 </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>role1=permission1,permission2 </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>[urls] </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>#用于web,提供了对web url拦截相关的配置,url=拦截器[参数],拦截器 </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>/index.html = anon </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>/admin/** = authc, roles[admin], perms["permission1"] </span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.先配置认证器,认证策略,不配置以上默认</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.再配置授权器,不配置以上默认</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.再配置realm,最后设置securitymanager.realm。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p>',9,'Shiro'),(5,'Oracle','oracle是以用户为单位 一个用户创建的表另外一个用户看不见,除非给予了权限oracle大小写区分用户管理(命令要加分号){ 创建用户:create user 用户名 identified by 密码;(要加分号) 刚刚创建的用户没有任何权限,不能登录数据库 显示当前用户权限:show user; ','2017-12-18 13:54:28',3,0,'<p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">oracle是以用户为单位 一个用户创建的表另外一个用户看不见,除非给予了权限</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">oracle大小写区分</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">用户管理(命令要加分号)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 创建用户:create user 用户名 identified by 密码;(要加分号)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 刚刚创建的用户没有任何权限,不能登录数据库</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 显示当前用户权限:show user;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 修改密码:password 用户;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 删除用户:drop user 用户名(不能删自己)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 给用户授权:grant connect to 用户名</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 高级用户自己创建的表低级用户不能看的到,反过来高级用户可以看到低级用户创建的表</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 吧自己的表授权给其他用户:grant select on 表名 to 用户名</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 然后如果再访问其他人的表的话就要用(正在的表主.表名)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果是给予修改,添加,删除的权限:grant insert(update,delete) on 表名 to 用户名</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 全部给可以:grant all on 表名 to 用户名</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 收回权限:revoke select on 表名 from 被授权的用户(其他同上)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">表的管理</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 创建表:create table 表名(字段名 字段类型...);</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 查看表的结构:desc 表名;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 重新添加字段:alter table 表名 add (字段名 字段类型)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 修改字段:alter table 表名 modify (字段名 字段类型)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 删除字段:alter table 表名 drop column 字段名;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 修改表名:rename 旧表名 to 新表名</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 删除表:drop table 表名</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 插入数据:insert into 表名 values(值);</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 插入一定的字段:insert into 表名 (字段名) values (字段值)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> nvl函数:nvl(字段,0):如果字段值是null,那么他的值是0</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 时间的比较:date > '1-2月-年' 1-2月-1982</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 在什么之间:between and</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 一次插入多条语句:insert into 表名 ((插入的字段)a,b,c) select a,b,c from 另外一张表名 where.....</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 多次更新:update 表名 set ((字段名)a,b,c)=(select ((字段名)a,b,c) from 表名)where......</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> dml语句:增删改;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> select * from 表名 where 字段名 = &no;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 加了&号,数据库会弹出一个框框输入数字</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 表分组查询总结</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.分组函数只能出现在选择列表,having,order by子句中</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.如果select语句包括了order by,having,group by,他们的顺序是</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> group by,having,order by;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.如果选择列中如果有列,分组函数,表达式,那么他们之中有一个</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 字段要出现在group by中</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.where是对单个的处理</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 5.having是对一个组的处理</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 6.多表查询条件数量必须要大于表数-1</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 分页查找</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 查找6到10条数据:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> select b.*,rownum rn from (select a.*, rownum rw from (select * from student ) a where rownum <= 10) b where rownum >= 6;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 要想改变查找内容或者是查找顺序 只需要在最里面的select语句改变即可</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">权限</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 系统权限:用户对数据库系统的操作对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 对象权限:用户对其他用户的操作对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">oracle数据库有各种权限,如果一个一个给用户的话会很麻烦</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">于是出现了角色</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">角色(相当于把各种权限封装起来)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 预定义角色:数据库本身就提供</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 常用几种预定义角色</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> connect:一般应用人员 只能看表 不能创建表</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> resource:一般开发人员</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> dba:拥有所有管理权限</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 自定义角色:自己定义</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">profile</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 使用profile可以管理用户名的口令,比如三次输入不正确不能进入或者</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 规定时间修改密码</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">数据类型</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> char:定长最大2000字符</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> varchar2:变长</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> number:存储数字 </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> number(x,y):一共x位,保留y位有效数字</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> number(x):x位整数</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Data:存储日期 添加时间:日-月-年 2016-8-7->7-8月-16 中间的月一定要带</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 也可以用insert into 表名 values(to_date('年-月-日','YYYY-MM-DD'));</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> timestamp:更高精度的存储时间</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> blob:二进制数据,可以用于存放图片声音</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">事务</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 为了维持数据的一致性</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 操作:在传输SQL语句之前 用connection.setAutoCommit(false);设置不自动提交</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果出现了异常:connection.rollback();</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果最后成功了:connection.commit();</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 设置只读事务</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> set transaction read only;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 只允许查询操作而不允许dml,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 尽管其他回话会进行新的操作改变,但是</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 执行了只读事务就不会获取最新的变化,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 从而可以获取特定的时间点的数据。</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">函数</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">sysdate:系统时间。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">string</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> lower:将字符串转化为小写的形式。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> upper:将字符串转化为大写的形式。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> length:求字符串的长度。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> substr:求字符串的子串。substr(char,m,n);</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 字符串合并:||。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> replace:取代特定字符串</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> round:四舍五入 round((要处理的数字),(保留小数点多少位)).</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> last_day:求这个月的最后一天</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> to_char:可以转换时间,to_char((date类型的日期),'(类型)yyyy-mm-dd').</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 类型可以指定是yyyy-mm-dd hh24:mi:ss 精确到秒</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果添加的时候没有指定这个hh24:mi:ss的格式,输出按照这个格式会</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 全部输出0.</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 显示格式可用to_char</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 存储可用to_date</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">系统函数</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> select sys_context('USERENV','a') from dual;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> a</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> db_name:正在使用数据库的名字。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> language:正在使用的语言。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> session_user:正在登陆的用户。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> host:正在使用数据库的本机。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">dual表是oracle数据库和数据字典自动创建的一个表,自动创建</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">当创建一个用户的时候,数据库会把用户信息存储到数据字典中,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">当给用户授予权限的时候,也会把权限写入到数据字典,如果想看</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">有多少用户的时候就可以查找数据字典。 </span></p><p><br/></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">约束</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> not null:不能为空.</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> unique:唯一但可以为空</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> primary key:主键,不能为空,一个表只能有一个</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> foreigh key:用于定义主表和从表的关系</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> check:用于强制数据满足与规定的关系</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> SQL语句修改约束:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 除了not null使用modify 其他约束修改使用add</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> alter table 表名 midify/add 字段名 约束</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">表级定义和列级定义</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 表级定义就是全部把字段定义完了再定义约束,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 列级定义就是定义字段的同时就定义约束了。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">索引</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 有时一些字段查询的次数比较多,可以建立索引加快查询速度。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> create index 索引名 on 表名 (列名或字段名)。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> create index first on student(name);</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 以上为单列索引。</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果两个或三个字段查询的次数较多</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 可以建立复合索引。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> create index 索引名 on 表名 (列名或字段名,列名或字段名.....)。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 使用原则:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.在大表上建立才有意义。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.在where子句或经常引用的列上面建立索引。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.索引不超过四层。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">角色</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 把角色打包赋给某个用户,可以简化操作。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">pl/sql编程</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> pl/sql编程是SQL语句的一种扩展。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> pl/sql编写过程函数,过程函数会把函数先编译,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 所以再调用的时候就快很多。</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> create procedure 名字 is</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> begin</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> --过程</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> end</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> /(斜杠代表数据库执行存储过程)</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 查看创建过程编译错误</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> show error</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 调用过程</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> exec 过程名(参数.....)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> call 过程名(参数.....)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 分类</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 快{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 过程</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 函数</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 触发器</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 包</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><br/></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> declare:定义变量,声明,常量,游标。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> begin:执行部分,要执行的SQL语句</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> exception:例外执行部分 异常处理</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> end:结束</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">oracle分页显示</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 变量</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> pageNow 表示第几页,该变量是有用户决定</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> pageSize 每页显示第三条记录</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> pageCount 表示共有多少页</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> rowCount 共有多少条记录 select count(*) from users;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 查找</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> select next.*,rownum num from (select new.*,rownum num from(select * from users order by id) new where rownum <= 6) next where num >= 3;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 第一次where语句调范围用rownum,第二次用rownum的别名</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 括号里面的为第一次,外面为第二次.</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 添加范围:(pageNow*pageSize) (pageSize*(pageNow-1)+1)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">设置自增长</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> create sequence users_seq</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> start with (开始的值)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> increment by (每次增长)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> minvalue (最小值)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> maxvalue (最大值)也可以没有最大值 nomaxvalue</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> nocycle 不循环</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> nocache 不缓存</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">·</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 添加的时候insert into 表名 values(users_seq.nextval,......); </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">用resultset获取查找语句</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 可以用resultset.getMataData获取ResultSetMataData</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 再ResultSetMataData.getColumnCount</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p>',10,'oracle oracle'),(6,'Mybatis','mybatis{ 数据库基本连接操作 { InputStream inputStream = org.apache.ibatis.io.Resources .getResourceAsStream(\"mybatis-config.xml\"); SqlSessionFactory sq','2017-12-18 13:59:09',2,0,'<p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">mybatis</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">{</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 数据库基本连接操作</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> {</span></p><pre class=\"brush:java;toolbar:false\"> InputStream inputStream = org.apache.ibatis.io.Resources\n .getResourceAsStream("mybatis-config.xml");\n SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()\n .build(inputStream);\n SqlSession session = sqlSessionFactory.openSession();\n com.springmvc.interface_.user user2 = new com.springmvc.interface_.user(\n "user", "text", "18");\n session.insert("com.springmvc.interface_.user.insertStu", user2);\n session.commit();\n session.close();\n }</pre><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">}</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">步骤</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">{</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 1.先建立全局配置文件,mybatis_config.xml;</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 2.利用全局配置文件创建出一个SQLsessionfactory工厂</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 编写映射mapper文件,用于SQL语句的映射。(在映射文件里面写SQL语句不能加;号)在全局配置文件加上对映射SQL语句文件的注册</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 这个工厂是用单例模式。</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 3.利用工厂创建一个SQLsession对象,这个是mybatis的持久化对象</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> {</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 一般调用SQL语句有两种方法</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> {</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 1.直接得到SQLsession对象,调用映射配置文件的namespace名字域来调用里面的函数</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> (如果调用opensession无参方法,将会默认事务是手动提交)</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 2.把映射文件和接口绑定起来,可利用sqlsession.getMapper(获取发射类型class)</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 来获取一个代理对象,利用这个对象、</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 调用里面的定义未实现的函数来实现操作数据库(绑定接口的方式操作数据库可以设置返回值,</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> void,boolean,int,integer,long,就是在接口中定义函数的时候设置,mybatis会自动封装)</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> }</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> }</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 用于执行已经映射的SQL语句(#{}从传过来的参数中去值)</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">}</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">SQL语句引映射</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">{</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 1.SQL语句不用加;号</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 2.存储对象要加一个无参构造器,他会先使用无参构造器构造一个对象再利用set函数赋值</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">}</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">returntype,returnmap返回值(只能二选一,而returnmap可以自定义规则)</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">{ </span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 1.普通的返回值可以使用returntype确定,写上全类名即可。</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 2.如果映射对象的字段的名字和数据库映射表的对象不一样,就可以使用resultmap指定</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 3.如果用到了关联查询,就要使用returnmap来指定</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 4.如果希望返回类型是map<主键,类型>,可以使用一个@MapKey来指定返回map的key是什么</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">}</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">mybatis参数传递规则</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">{</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 1.单个参数</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> {</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 将不会做特殊处理, 会直接取出参数值,</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 所以SQL映射语句里面的参数名称写什么都可以</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 如果这个单个参数是collection集合,那么mybatis还是会做特殊处理</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 会把集合封装成一个map,而可以就是collection</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 参数list<Integer> ids</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 得到第一个id</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> id : #{list[0]}(直接使用类型的名字)</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> }</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 2.多个参数</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> {</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 多个参数mybatis会做特殊处理,会把参数封装成一个map的集合对象</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 集合对象的key是param1到paramN,所以如果是多个参数就必须要用#{Parma....}</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 来获取,也可以利用索引,0,1,2,3等等。</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 可以使用命名参数封装:</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 再使用文件绑定接口调用映射SQL语句的时候,在传递参数的时候</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 使用@param注解:@param("a") Integer a,那么到时候在mybatis里面</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 封装的时候就会自动把a作文map的key,到时候传参数的时候,就可以直接</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> #{a}获取参数了</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> }</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 3.传递对象</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> {</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 传递的如果是对象,参数的名称就是对象的属性名,</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 可以直接#{对象属性名};</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> }</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 4.传递map集合</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> {</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 因为如果传递普通参数到最后也会变成一个map</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 所以可以直接传递一个map集合过去,那么也可以直接通过key拿数据</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> }</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 5.自增长主键的使用</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> {</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 如果想插入的键自增长</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 在insert标签配置useGeneratedKeys="true" keyColumn="id</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 并且要在数据库配置alter table student modify id integer AUTO_INCREMENT;</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 如果是MySQL BD2数据库可以支持自增长就可以使用</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 如果是oracle这种使用序列模拟自增长就要使用keyproperty属性来设置</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> }</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">}</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">#{}和${}</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">{</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> #{}:属于预编译,类似于jdbc的 preparestatement,变成通配符的形式,可以用于防止SQL的注入</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> ${}:会把取出的值直接放到SQL语句里面,会有安全问题,比如连接数据库使用的配置文件,或者</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 动态查找表</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">}</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> </span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">关联查询的封装对象</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">{</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 1.可以使用级联属性(级联属性可以用.号取下一个)</span></p><pre class=\"brush:java;toolbar:false\"> <resultMap type="com.springmvc.interface_.student" id="student">\n <id property="id" column="id"/>\n <result property="name" column="name" />\n <result property="age" column="age" />\n <result property="sex" column="sex"/>\n <result property="class_id" column="Class.id" />\n <result property="class_name" column = "Class.name"\n </resultMap>\n \n \n <select id="selectAll_Stu" resultMap="student"> \n select s.*,c.* from student s,Class c where s.id = c.Class_id \n </select></pre><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 2.直接指定联合Javabean的对象</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> <!-- javatype用于指定关联属性的对象类型 --!></span></p><pre class=\"brush:java;toolbar:false\"> <!-- property用于指定类型 --!>\n <resultMap type="com.springmvc.interface_.student" id="student">\n <id property="id" column="id"/>\n <result property="name" column="name" />\n <result property="age" column="age" />\n <result property="sex" column="sex"/>\n <association property="Class_" column="class_id" \n javaType="com.springmvc.interface_.Class_" select="selectClass"></association> \n </resultMap>\n <select id="selectAll_Stu" resultMap="student"> \n select * from student \n </select>\n <select id="selectClass" resultType="com.springmvc.interface_.Class_">\n select * from class where class_id = #{class_id}\n </select>\n}</pre><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">动态SQL查询</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">{</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> if,choose,trim,where,set,foreach,bind</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 可以在模糊查询的时候使用,用户填写了id号才查,填了name才查</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 可以用if控制,和jstl差不多</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> if:</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 支持加减乘除,and or都可以,查询的时候如果有ID就查ID</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> <if test = "id != null">会从参数里面取值出来</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> choose:</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 只会选择一个分支</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> trim:</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 截取一部分,可以加前后缀</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> where:</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 用于写后面的条件标签</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> set:</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 用于更新update操做</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> foreach:</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> {</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> collection:指定遍历的集合</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> item:把指定遍历的集合里面的变量赋值到一个新的变量,到时候取值就可以按照里面的用#{}取</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> index:存储list的时候的索引</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> open:开头</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> separator:分割符</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> close:结束</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> }</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> </span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> mybatis两个内置对象</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> {</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 1._parameter:代表所有的参数</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 如果参数只有一个,那就是parameter,如果有好多个</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 就会被封装成一个map,parameter就是这个map</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 2._databaseID:代表数据库的别名。</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> }</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">}</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">使用注解</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">{</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> @insert静态插入</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> @insertprovider动态插入</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> resultmap返回值 = results</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> </span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 必须在mybatis全局配置文件进行注册</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">}</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">使用mybatis逆向工程创建表的Mapper</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\">{</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> XML文件必须配置</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 1.jdbcConnection 连接数据库的方式</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 2.Javamodelgenerator 为生成指定目标模型指定包和工程</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 3.SQLMappergenerator 指定目标映射XML文件的包和目标工程</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 3.Javaclientgenerator 指定接口类的包名和工程</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 4.table 指定要逆向的表名</span></p><p><span style=\"font-size: 20px; font-family: 隶书, SimLi;\"> 5.开头context要指定mybatis的类型</span></p><p><br/></p><pre class=\"brush:java;toolbar:false\"> XML\n {\n <?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE generatorConfiguration\n PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"\n "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">\n\n<generatorConfiguration>\n <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />\n\n <context id="DB2Tables" targetRuntime="MyBatis3">\n <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"\n connectionURL="jdbc:db2:TEST"\n userId="db2admin"\n password="db2admin">\n </jdbcConnection>\n\n <javaTypeResolver >\n <property name="forceBigDecimals" value="false" />\n </javaTypeResolver>\n\n <javaModelGenerator targetPackage="test.model" targetProject="\\MBGTestProject\\src">\n <property name="enableSubPackages" value="true" />\n <property name="trimStrings" value="true" />\n </javaModelGenerator>\n\n <sqlMapGenerator targetPackage="test.xml" targetProject="\\MBGTestProject\\src">\n <property name="enableSubPackages" value="true" />\n </sqlMapGenerator>\n\n <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="\\MBGTestProject\\src">\n <property name="enableSubPackages" value="true" />\n </javaClientGenerator>\n\n <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >\n <property name="useActualColumnNames" value="true"/>\n <generatedKey column="ID" sqlStatement="DB2" identity="true" />\n <columnOverride column="DATE_FIELD" property="startDate" />\n <ignoreColumn column="FRED" />\n <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />\n </table>\n\n </context>\n</generatorConfiguration>\n\n }\n}</pre><p><br/></p>',5,'mybatis'),(7,'Maven','maven{ maven开发的项目将不带架包,架包由jar仓库管理。 通过坐标查找架包信息,公司名+项目名+版本信息 maven目录 { bin:可执行脚本文件,开启关闭 conf:配置文件 lib:架包 } maven项目 { 错误: ','2017-12-18 13:59:49',2,0,'<p><span style=\"font-size: 20px;\">maven</span></p><p><span style=\"font-size: 20px;\">{</span></p><p><span style=\"font-size: 20px;\"> maven开发的项目将不带架包,架包由jar仓库管理。</span></p><p><span style=\"font-size: 20px;\"> 通过坐标查找架包信息,公司名+项目名+版本信息</span></p><p><br/></p><p><span style=\"font-size: 20px;\"> maven目录</span></p><p><span style=\"font-size: 20px;\"> {</span></p><p><span style=\"font-size: 20px;\"> bin:可执行脚本文件,开启关闭</span></p><p><span style=\"font-size: 20px;\"> conf:配置文件</span></p><p><span style=\"font-size: 20px;\"> lib:架包</span></p><p><span style=\"font-size: 20px;\"> }</span></p><p><br/></p><p><span style=\"font-size: 20px;\"> maven项目</span></p><p><span style=\"font-size: 20px;\"> {</span></p><p><span style=\"font-size: 20px;\"> 错误:</span></p><p><span style=\"font-size: 20px;\"> 1.缺失web.xml,创建WEB-INF目录,创建web.xml</span></p><p><span style=\"font-size: 20px;\"> 2.jdk错误,pom.xml配置JDK插件</span></p><p><span style=\"font-size: 20px;\"> }</span></p><p><span style=\"font-size: 20px;\">}</span></p><p><span style=\"font-size: 20px;\"><br/></span></p>',6,'maven'),(8,'luene','luence{ luence流程 { 1.写入流程 先将源字符串用analyze处理 再把经过解析的字符串加入到document的各个field中,并且把需要索引field索引起来,需要储存的filed储存起来 2.读出流程 用户提供搜索关','2017-12-18 14:00:19',1,0,'<p><span style=\"font-size: 20px;\">luence</span></p><p><span style=\"font-size: 20px;\">{</span></p><p><span style=\"font-size: 20px;\"> luence流程</span></p><p><span style=\"font-size: 20px;\"> {</span></p><p><span style=\"font-size: 20px;\"> 1.写入流程</span></p><p><span style=\"font-size: 20px;\"> 先将源字符串用analyze处理</span></p><p><span style=\"font-size: 20px;\"> 再把经过解析的字符串加入到document的各个field中,并且把需要索引field索引起来,需要储存的filed储存起来</span></p><p><span style=\"font-size: 20px;\"> 2.读出流程</span></p><p><span style=\"font-size: 20px;\"> 用户提供搜索关键字,经过analysis处理后得到处理过的关键字</span></p><p><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; white-space: pre;\"> </span>再通过关键字找到对应的document</span></p><p><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; white-space: pre;\"> </span>根据需要从document中提取需要的field</span></p><p><span style=\"font-size: 20px;\"> }</span></p><p><br/></p><p><span style=\"font-size: 20px;\"> luence组件</span></p><p><span style=\"font-size: 20px;\"> {</span></p><p><span style=\"font-size: 20px;\"> 1.analyzer</span></p><p><span style=\"font-size: 20px;\"> {</span></p><p><span style=\"font-size: 20px;\"> 分析器:作用是把一个字符串按照某种规则划分,去掉无效关键字</span></p><p><span style=\"font-size: 20px;\"> 缩小索引文件,提高命中率</span></p><p><span style=\"font-size: 20px;\"> }</span></p><p><span style=\"font-size: 20px;\"> 2.document</span></p><p><span style=\"font-size: 20px;\"> {</span></p><p><span style=\"font-size: 20px;\"> 用户提供的源是一条条记录,他可以是文本文件,字符串或数据库的一条记录</span></p><p><span style=\"font-size: 20px;\"> 一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。</span></p><p><span style=\"font-size: 20px;\"> }</span></p><p><span style=\"font-size: 20px;\"> 3.field</span></p><p><span style=\"font-size: 20px;\"> {</span></p><p><span style=\"font-size: 20px;\"> 一个document可以包含多个信息域field</span></p><p><span style=\"font-size: 20px;\"> field有两个属性:存储和索引;由他表示的时间和他的所表示的field组成</span></p><p><span style=\"font-size: 20px;\"> }</span></p><p><span style=\"font-size: 20px;\"> 4.tocken</span></p><p><span style=\"font-size: 20px;\"> {</span></p><p><span style=\"font-size: 20px;\"> tocken是term的一次出现,它包含term文本和相应的起止偏移,</span></p><p><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; white-space: pre;\"> </span>以及一个类型字符串。一句话中可以出现多次相同的词语,</span></p><p><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; white-space: pre;\"> </span>它们都用同一个term表示,</span></p><p><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; white-space: pre;\"> </span>但是用不同的tocken,每个tocken标记该词语出现的地方。</span></p><p><span style=\"font-size: 20px;\"> }</span></p><p><span style=\"font-size: 20px;\"> 5.segment</span></p><p><span style=\"font-size: 20px;\"> {</span></p><p><span style=\"font-size: 20px;\"> 分支时并不是一起加入document,而是先写到不同的小文件,</span></p><p><span style=\"font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; white-space: pre;\"> </span>然后在合并成一个大索引文件</span></p><p><span style=\"font-size: 20px;\"> }</span></p><p><span style=\"font-size: 20px;\"> }</span></p><p><span style=\"font-size: 20px;\">}</span></p><p><br/></p>',6,'全文检索 luene'),(9,'Jsp','JSP运行在服务器,基础是servlet<% 写Java代码 %>在<%%>中定义的Java变量,会定义在service中做为局部变量JSP三种元素{ 1.指令元素 page元素,用于从JSP发送一个信息给容器 { 常用属性 language:JSP中镶嵌的语言 impor','2017-12-18 14:00:43',4,0,'<p><span style=\"font-size: 20px;\">JSP运行在服务器,基础是servlet</span></p><p><span style=\"font-size: 20px;\"><% 写Java代码 %></span></p><p><span style=\"font-size: 20px;\">在<%%>中定义的Java变量,会定义在service中做为</span></p><p><span style=\"font-size: 20px;\">局部变量</span></p><p><br/></p><p><span style=\"font-size: 20px;\">JSP三种元素</span></p><p><span style=\"font-size: 20px;\">{</span></p><p><span style=\"font-size: 20px;\"> 1.指令元素 page元素,用于从JSP发送一个信息给容器</span></p><p><span style=\"font-size: 20px;\"> {</span></p><p><span style=\"font-size: 20px;\"> 常用属性</span></p><p><span style=\"font-size: 20px;\"> language:JSP中镶嵌的语言</span></p><p><span style=\"font-size: 20px;\"> import:导入的包</span></p><p><span style=\"font-size: 20px;\"> session:是否可以在JSP中获取session对象</span></p><p><span style=\"font-size: 20px;\"> buffer:给out对象的缓冲区多大,默认8k。JSP并不是看到一个out输出就输出到</span></p><p><span style=\"font-size: 20px;\"> 浏览器,是吧内容存到一个缓冲区在一起写</span></p><p><span style=\"font-size: 20px;\"> autoflash:当buffer满之后是否自动刷新到浏览器</span></p><p><span style=\"font-size: 20px;\"> errorpage:当JSP出现错误就跳到错误界面</span></p><p><span style=\"font-size: 20px;\"> }</span></p><p><br/></p><p><span style=\"font-size: 20px;\"> 2.脚本元素</span></p><p><span style=\"font-size: 20px;\"> {</span></p><p><span style=\"font-size: 20px;\"> 1.<%java代码%></span></p><p><span style=\"font-size: 20px;\"> 2.表达式 <%=java表达式%></span></p><p><span style=\"font-size: 20px;\"> 3.declaration声明 <%!的声明是在整个servlet中的%> <%相当于在service里面定义%></span></p><p><span style=\"font-size: 20px;\"> }</span></p><p><span style=\"font-size: 20px;\"> 3.动作元素</span></p><p><span style=\"font-size: 20px;\"> {</span></p><p><span style=\"font-size: 20px;\"> jsp:forward:跳转,<jsp:forward page="/跳转页面.jsp"></jsp:forward> 和servlet的转向是一样的。</span></p><p><span style=\"font-size: 20px;\"> 如果把JSP文件直接放到webroot外面,其他人可以访问的到。所以一般留一个JSP文件在外面充当入口,</span></p><p><span style=\"font-size: 20px;\"> 吧其他文件放到WEB-INF中,直接浏览器URL就访问不到,只能由转向访问到。</span></p><p><span style=\"font-size: 20px;\"> 引入文件:</span></p><p><span style=\"font-size: 20px;\"> <%@ include file = ""%> 静态引入</span></p><p><span style=\"font-size: 20px;\"> <jsp:include file = ""></jsp:include>动态引入</span></p><p><span style=\"font-size: 20px;\"> 相同:都是引入文件</span></p><p><span style=\"font-size: 20px;\"> 不同点:静态引入,就是吧两个JSP文件编译成一个servlet,所以被引入的文件不能包含body</span></p><p><span style=\"font-size: 20px;\"> 动态引入是分别编译成两个servlet,所以可以包含。</span></p><p><span style=\"font-size: 20px;\"> }</span></p><p><span style=\"font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-size: 20px;\">JSP运行原理</span></p><p><span style=\"font-size: 20px;\">{</span></p><p><span style=\"font-size: 20px;\"> 当第一次调用JSP文件</span></p><p><span style=\"font-size: 20px;\"> 会先编译成一个文件名_jsp.java,</span></p><p><span style=\"font-size: 20px;\"> 再编译成一个文件名_jsp.class文件,</span></p><p><span style=\"font-size: 20px;\"> 在吧这个类加载到内存</span></p><p><br/></p><p><span style=\"font-size: 20px;\"> 如果是第二次访问,就会直接访问内存的class文件</span></p><p><span style=\"font-size: 20px;\"> 所以servlet也是单例,因为JSP实质上也是servlet</span></p><p><br/></p><p><span style=\"font-size: 20px;\"> 当某个JSP文件被修改了,就相当于第一次访问</span></p><p><span style=\"font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-size: 20px;\">JSP九大内置对象</span></p><p><span style=\"font-size: 20px;\">{</span></p><p><span style=\"font-size: 20px;\"> out:想客户端输出数据,字节流</span></p><p><span style=\"font-size: 20px;\"> request:接收客户端http请求,相当servlet的httpservletrequest</span></p><p><span style=\"font-size: 20px;\"> response:响应客户端的http请求,相当于servlet的httpservletresponse对象</span></p><p><span style=\"font-size: 20px;\"> session:用于保存用户信息,跟踪用户行为</span></p><p><span style=\"font-size: 20px;\"> application:多个用户共享对象,可以做计数器,相当于servletcontext</span></p><p><span style=\"font-size: 20px;\"> pageContext:代表JSP页面的上下文,也是一个域对象,可以使用setattribute,但仅仅作用于本页面</span></p><p><span style=\"font-size: 20px;\"> exception:代表运行时的异常</span></p><p><span style=\"font-size: 20px;\"> page:代表这个实力本身</span></p><p><span style=\"font-size: 20px;\"> config:代表JSP对应的servlet的配置</span></p><p><br/></p><p><span style=\"font-size: 20px;\"> 内置对象必须要写到<%%>里面,如果写在外面,就会被误认为一个文本</span></p><p><span style=\"font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-size: 20px;\">CSS JSP写在web-inf</span></p><p><span style=\"font-size: 20px;\">{</span></p><p><span style=\"font-size: 20px;\"> web-INF不可以被外面的所识别</span></p><p><span style=\"font-size: 20px;\"> 他会默认找http://127.0.0.1:3306/项目名。。。。</span></p><p><span style=\"font-size: 20px;\"> 所以要加上路径<% pageContext.setAttribute("path",request.getContextPath()); %></span></p><p><span style=\"font-size: 20px;\"> <link href="${path}/static/bootstrap-3.3.7-dist/css/bootstrap-theme.css" rel="stylesheet"></span></p><p><span style=\"font-size: 20px;\">}</span></p><p><br/></p>',7,'jsp'),(10,'Java邮件开发','电子邮件服务器主要作用{ 1.接收用户投递的邮件 2.将用户投递进来的邮件转发给目标邮件服务器 3.接收其他邮件投递进来的邮件并转发到其他管理用户中 4.为前来读取邮件的用户提供读取服务}邮件服务器按照通讯协议可以分为两种{ SMTP服务器(服务器接收邮件,服务器之间邮件的传输) ','2017-12-18 14:01:35',4,0,'<p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">电子邮件服务器主要作用</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 1.接收用户投递的邮件</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 2.将用户投递进来的邮件转发给目标邮件服务器</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 3.接收其他邮件投递进来的邮件并转发到其他管理用户中</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 4.为前来读取邮件的用户提供读取服务</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">}</span></p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">邮件服务器按照通讯协议可以分为两种</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> SMTP服务器(服务器接收邮件,服务器之间邮件的传输)</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> POP3/IMAP服务器(收件人接收邮件使用的)</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">}</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"></span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">收发邮件,每个用户,无论是目标用户还是发送用户,都需要两个服务器</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">一个是SMTP服务器,POP3服务器。</span></p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">Javamail方法可以无需管底层协议直接操作邮件发送</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 1.创建和解析邮件内容的API:Message类</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 2.发送邮件的API:Transport类</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 3.接收邮件的API:Store类接收邮件的核心API类</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 4.环境信息匹配:session类</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">}</span></p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">1.设置连接信息</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">2.确定权限</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">3.设置连接</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">4.写内容</span></p><p style=\"white-space: normal;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">5.发信息</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"><br/></span><br/></p><pre class=\"brush:java;toolbar:false\"> package text;\n \n import java.util.Properties;\n \n import javax.mail.Authenticator;\n import javax.mail.Message;\n import javax.mail.MessagingException;\n import javax.mail.PasswordAuthentication;\n import javax.mail.Session;\n import javax.mail.Transport;\n import javax.mail.Message.RecipientType;\n import javax.mail.internet.AddressException;\n import javax.mail.internet.InternetAddress;\n import javax.mail.internet.MimeMessage;\n \n public class text {\n public static void main(String[] args) throws Exception{\n //0.1 确定连接位置\n Properties props = new Properties();\n //获取163邮箱smtp服务器的地址,\n props.setProperty("mail.host", "smtp.163.com");\n //是否进行权限验证。\n props.setProperty("mail.smtp.auth", "true");\n //0.2确定权限(账号和密码)\n Authenticator authenticator = new Authenticator() {\n @Override\n public PasswordAuthentication getPasswordAuthentication() {\n //填写自己的163邮箱的登录帐号和授权密码,授权密码的获取,在后面会进行讲解。\n return new PasswordAuthentication("15813359204","199821130365lyk");\n }\n };\n \n //1 获得连接\n /**\n37 * props:包含配置信息的对象,Properties类型\n38 * 配置邮箱服务器地址、配置是否进行权限验证(帐号密码验证)等\n39 * \n * authenticator:确定权限(帐号和密码) \n * \n * 所以就要在上面构建这两个对象。\n \n */\n \n Session session = Session.getDefaultInstance(props, authenticator);\n session.setDebug(true);\n \n //2 创建消息\n Message message = new MimeMessage(session);\n // 2.1 发件人 [email protected] 我们自己的邮箱地址,就是名称\n message.setFrom(new InternetAddress("[email protected]"));\n /**\n53 * 2.2 收件人 \n54 * 第一个参数:\n55 * RecipientType.TO 代表收件人 \n56 * RecipientType.CC 抄送\n57 * RecipientType.BCC 暗送\n58 * 比如A要给B发邮件,但是A觉得有必要给要让C也看看其内容,就在\n给B发邮件时,\n59 * 将邮件内容抄送给C,那么C也能看到其内容了,但是B也能知道A给C抄送过该封邮件\n60 * 而如果是暗送(密送)给C的话,那么B就不知道A给C发送过该封邮件。\n61 * 第二个参数\n6 * 收件人的地址,或者是一个Address[],用来装抄送或者暗送人的名单。或者用来群发。可以是相同邮箱服务器的,也可以是不同的\n * 这里我们发送给我们的qq邮箱\n */\n message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));\n // 2.3 主题(标题)\n message.setSubject("邮件的标题");\n // 2.4 正文\n String str = "李四: <br/>" +\n "您好,您在本论坛注册用户,点击下面url进行激活<br/>" +\n "http://ww......<br/>" +\n "如果不能点击,请复制直接激活<br/>" +\n \n "如果不是本人,请删除邮件";\n //设置编码,防止发送的内容中文乱码。\n message.setContent(str, "text/html;charset=UTF-8");\n \n \n //3发送消息\n Transport.send(message);\n }\n}</pre><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"></span><br/></p>',1,'邮件 Java'),(11,'JavaScript正则表达式','dom编程的话他会先把HTML文件变成一个dom树前面的!DOCTYPE HTML到title作为一个根节点下面的就以此类推dom会把HTML的文件都元素看做一个内置对象同时也会把内置对象看做一个node节点从而就可以使用node节点的各个函数 把head元素title元素看做node对象正则表达式对应一种对','2017-12-18 14:02:08',1,0,'<p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">dom编程的话他会先把HTML文件变成一个dom树</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">前面的!DOCTYPE HTML到title作为一个根节点</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">下面的就以此类推</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">dom会把HTML的文件都元素看做一个内置对象</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">同时也会把内置对象看做一个node节点</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">从而就可以使用node节点的各个函数 把head元素</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">title元素看做node对象</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">正则表达式对应一种对象</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">隐士创建</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">var a = /正则表达式/gi(i代表是否执行不区分大小写 g表示全局查找)</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">显示创建</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">var reg = RegExp("正则表达式","规范")(使用显示创建就需要注意转义)</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">寻找4个数字(\\\\d)</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">规范</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">g代表全局查找</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">i代表是否执行不区分大小写</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">m代表是否多行查找</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">(\\d)代表任意数字 (\\D)非数字 与d相反 同 大写w与小写相反</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">(\\w)代表单词字符</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">但是如果是单个\\ 代表反向捕获 \\2 反向引用第二个 </span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">{}限定符 指定出现多少次 {n,m}匹配最多m次 如果没有就n次 属于</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">+ 限定符 一次到无限次/(\\d)+/gi 出现无数个数字 尽可能匹配多个 1到多次</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">* 限定符 出现0到多此 和+效果差不多 一个1到多次 一个0到多次</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">?限定符 出现0次或一次</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">^ 取反 [^a-z] 不是a到z的字符</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">. 限定符 匹配出来\\n之外的所以字符</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">[] [/w/W]字母或不是字母</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">定位符</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">^ 匹配目标字符串的开始位置 [^han] ahanjshqkw 不会找到任何东西 因为打头的是a 不含有han</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">$ 匹配目标字符串的结束位置 [han$] hjsqkwhank 不会找到 因为最后一个不含han</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">选择匹配</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">| 选择匹配 (a|c|b) 选择a或c或b</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">正则表达式的方法</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">exec()检索字符串中的指定的值 没有返回NULL</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">test()检索字符串中的指定的值 返回true或false</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">string中也有关于正则表达式的用法</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">search 寻找匹配的字符串 返回位置</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">match 返回一个数组 吧找到的东西放在数组中</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">打开新窗口</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">{</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> window类:window.open 直接打开新窗口</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> window.location.href='url' 当前页面跳转</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">}</span></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">table:加入readonly 只能读不能改</span></p><p><br/></p>',7,'正则表达式'),(12,'JAVA基础','\0Java基础{ 1.&和&&:&&是最常用,第一条语句为假就不再继续执行; &第一条语句是真还是假,都会执行到语句完为止; 2.final关键字修饰对象,是对象的引用不能改变,对象 内容还是可以改变的,指向对象的地址不能改变而已; 3.静态方法不能访问非静态方法,反过来可以; 4.==和equa','2017-12-18 17:08:03',4,1,'<p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">\0</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">Java基础</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.&和&&:&&是最常用,第一条语句为假就不再继续执行;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> &第一条语句是真还是假,都会执行到语句完为止;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.final关键字修饰对象,是对象的引用不能改变,对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 内容还是可以改变的,指向对象的地址不能改变而已;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.静态方法不能访问非静态方法,反过来可以;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.==和equals:如果是值,则两个对比的都是值的内容;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果是对象,例如string,==会比对地址,equals的内容;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 5.integer和int:integer是引用对象,对int的包装,默认null,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> int默认0;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 6重载与重写:重载是同一个类里面参数不同与返回值无关;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 重写发生在继承中,方法必须相同;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 7.接口和抽象类:接口成员不能私有,抽象类可以;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 接口中定义的成员变量是final,static,public类型,抽象类没有;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 两种都不能new</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 接口中不能有普通方法,抽象类中可以有;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 8.final,finally,finalize:final用于声明变量方法类,变量对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 不可改变,类不可以继承;finally属于异常的一种最后必执行的方法;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> finalize属于object的一个方法,当这个对象被垃圾回收机制回收时会被调用;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 9.string,stringbuffer,stringbuilder:string字符串常量,不可变,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> stringbuffer是线程安全,并且可变,stringbuilder是非线程安全,并且可变;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 10.hashcode:重写了equals方法一般都要重写hashcode方法,在具有哈希功能的</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 集合中,一般满足obj1.equals(obj2) == true就满足hashcode相等;</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 11.object对象自带函数以及注意对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.equals:比较函数,值比较内容,引用比较地址而已;一般需要重写</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.hashcode:hash编码,一般情况加不需要重写,但是如果要存在hashtable</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 或者hashmap的时候,需要重写hashcode和equals,如果hashcode不同,就直接false,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 但是内容相同不一定hashcode相同;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.tostring:这个方法是用于描述类内容,当直接使用system.out.print(对象)的时候</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 会调用一个valueof方法,这个方法会调用tostring方法</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.getclass:利用反射得到类的信息</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 5.wait:线程等待,锁释放</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 6.notify(all):线程唤醒</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 7.sleep:线程睡眠,锁不释放</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 8.clone:如果是值类型,直接克隆,如果是引用,只会克隆引用,不会克隆对堆里面的实质内容</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 称为浅克隆</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 9.finalize:GC垃圾回收机制调用的方法;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">集合</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> arraylist和linklist区别</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> arraylist底层数组实现,一般默认初始化(如果无指定大小)10个</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果add超过了10个,或者超出范围,就会new一个新的arraylist,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 新数组大小是原来数组的1.5倍加1,linklist是链表实现。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> ArrayList和vector</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> ArrayList是线程不安全的,vector是线程安全的;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 而如果超出了大小,ArrayList会默认增加1.5倍,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 而vector会增加2倍;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> hashmap和hashtable</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> hashmap是hashmap的轻量级实现,hashmap是线程不安全,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> hashtable是安全的,hashmap可以存NULL值,hashtable</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 不可以为空;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">\0<br/></span></p>',1,'Java 基础'),(13,'HTTP协议','http协议1.超文本传输协议2.http协议建立在TCP/IP基础上3.http协议有1.0,1.1版本。1.0是短连接,1.1是长连接,目前1.1通用。(短连接和长连接在于时间的不同,短连接一传输完就断开,长连接传输完还会继续连一段时间)http请求部分{ 结构 请求行消息头{ 消息名:消息内容}空行请','2017-12-18 17:10:20',2,0,'<p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"></span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">http协议</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">1.超文本传输协议</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">2.http协议建立在TCP/IP基础上</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">3.http协议有1.0,1.1版本。1.0是短连接,1.1是长连接,目前1.1通用。</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">(短连接和长连接在于时间的不同,短连接一传输完就断开,长连接传输完还会继续连一段时间)</span></strong></p><p><br/></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">http请求部分</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 结构</span></strong></p><p><br/></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 请求行</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">消息头</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 消息名:消息内容</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">空行</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">请求内容</span></strong></p><p><br/></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">2.详解消息头</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Accept:text/html,image/* (告诉浏览器可以接收文本,HTML,和image)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Accept-Charest:<span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span> (可以接收的编码)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Accept-Eneoding:<span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span> (可以接收压缩后的数据类型)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Accept-Language:<span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span> (可以接收中英文)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Host:<span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span> (找的主机是哪个)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> If-Wodified-Sines:<span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span> (告诉服务器本机是否有浏览网页的本地文件)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Referer:<span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span> (来自哪里,常用于防止盗链)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> User-Agent:<span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span> (浏览器的内核)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Cookie:<span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span> (有没有传cookie)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Connection:<span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span> (有没有断开)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Date:<span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span> (发送请求的时间)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></strong></p><p><br/></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">http响应部分</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 状态行</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> http版本号 状态码,原因概述(状态码表示服务器对请求的处理结果)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 状态行:</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span>200:表示顺利运行</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span>302:表示让浏览器跳转到其他页面</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span>404:表示页面不存在或请求异常</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span>500:表示服务端的错误 比如i = 500/0</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></strong></p><p><br/></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></strong></p><p><br/></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 消息头</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Location:定位到什么地方</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Servers:表明是什么服务器</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Content-Encoding:告诉浏览器使用了压缩</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Content-Length:告诉浏览器文件大小</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Content-Language:语言</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Content-Type:内容的类型(TXT,HTML或等等)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Last-Modified:上一次在本机中更新文件的时间</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Refresh:刷新(过多久刷新到什么地方)多少秒后转到什么地方</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Constent-Disposition:(下载:需要先把东西拿到服务器,再用流传输到浏览器的用户上去)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> EXpriem:缓存 IE浏览器识别 -1不缓存</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Cathe-control:缓存 火狐或其他浏览器识别 no-cathe</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Pragma:缓存<span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"></span>no-cathe</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></strong></p><p><br/></p><p><br/></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">java.mail(发送电子邮箱协议)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">smtp协议(简单邮件协议)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">pop3协议(邮局协议)</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">2017-12-1817:10:13</span></strong></p><p><strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></strong></p>',8,'http 网络传输'),(14,'Servlet详细教程','httpresponse{ getwrite:传递字符 getoutputstream:传递字节 getwrite和getoutputstream不能同时使用 因为这两个的输出函数都是write函数写出 写出后会检查流有没有关闭 如果没有会自动关闭 使用如果同时使用会有一个流没有被打开 send','2017-12-18 17:11:43',2,0,'<p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">httpresponse</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getwrite:传递字符</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getoutputstream:传递字节</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getwrite和getoutputstream不能同时使用</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 因为这两个的输出函数都是write函数写出</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 写出后会检查流有没有关闭 如果没有会自动关闭</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 使用如果同时使用会有一个流没有被打开</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> sendredirect:重定向 sendredirect("地址?变量名=变量内容&变量名=变量内容")</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> setHeader:设置消息头以及消息</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> setStaus:设置状态码</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">httprequest</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getRequestURL:得到客户端访问的URI地址</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getRequestURI:得到web资源名称和项目名 就是URL地址后面一部分</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getQueryString:得到由get方式访问的请求</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> http://127.0.0.1:8080/two/next?name=10 得到name=10</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getRemoteAddr:得到客户机IP地址</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getRemoteHost:得到客户机主机名</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getRemotePort:得到客户机的端口</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getLocalPort:返回服务器的端口号</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getLocalAddr:得到服务器的地址</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getLocalName:得到返回服务器的主机名</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getHeaderName:得到所有的http请求</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 接收表单数据也是可以用getParameter</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果接收复选框,就要使用getParameterValues 这个会返回一个数组</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 而如果什么都没有选 他会返回空值()这个方法post,get都器作用</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getRequestDispatcher(地址).forward(request,response):转向,只能转向在服务器里面的网页,因为他并没有返回到</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 浏览器,只是到服务器就返回,所以转向的网页没必要带(因为并没有回到浏览器,所以用的还是同一个</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> request和response 如果用request的转向,他的传递方式保持以前的,比如用表格传的是post,那么转向过后默认寻找下一个servlet的dopost)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> setAttribute:把对象放入request的域对象中,如果用转向传递request的话,、</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 可以用response.getAttribute获取到,因为是同一个request,可以获取到</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">中文乱码(浏览器中的信息以utf-8的编码方式传给了web服务器,web服务器用的是</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">ISO-8859-1编码接收 这样就是乱码,再传给servlet就更是乱码了)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.表单</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> post:在dopost设置utf-8 </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>response.setContentType("text/html;charset=utf-8");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>request.setCharacterEncoding("utf-8");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>response.setCharacterEncoding("utf-8");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span> 而且必须要把这些设置放在最前面</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> get</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 因为没有把信息封装到http的请求行里 所以get不能用</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>上面post的方法 (所以get的东西会显示在URL上面)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> string = new String(string.getByte("iso-8859-1"),"utf-8");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.超链接</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 本质上是get提交 所以用get的处理方法即可</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <a href = "地址?变量名:内容">测试</a></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 得到的内容按照get来处理</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.sendredirect</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 和get一样的处理方法</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 尽量用post</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">文件下载</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> response.setContentType("text/html;charset=utf-8");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>response.setHeader("Content-Disposition", "attachment;filename=1.jpg"); <span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> String path = this.getServletContext().getRealPath("/image/1.jpg");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> FileInputStream fileInputStream = new FileInputStream(path);</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> byte b[] = new byte[1024];</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> int len = 0;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> OutputStream outputStrea = response.getOutputStream();</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> while((len = fileInputStream.read(b)) != -1)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> <span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>outputStrea.write(b,0,len);</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">跳转</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.java static</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.response.sendredirect</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.session</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.request转向</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">sendRedirect和forward的区别</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 发生的位置不一样</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.sendRedirect发生在浏览器,forward发生在web服务器</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.用法不一样sendRedirect("/资源/web应用");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> request.getRequestDispachar("/web应用");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.能够去的范围不一样</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> sendRedirect能去任意的URL</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getRequestDispachar只能去web应用资源</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.sendRedirect改变后URL会显示当前的URL</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 而getRequestDispachar只会显示第一URL</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 因为有能力改变URL只有浏览器,而getRequestDispachar没有经过</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 浏览器,只是经过了web服务器</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">过滤器Filer</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 在客户端请求范围后端资源之前拦截请求。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 在服务器响应返回客户端时,处理这些响应。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">会话技术</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{ </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">cookie</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 用户打开一个浏览器,无论点击多少次,一直到关闭浏览器</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 就叫做一个会话</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> cookie创建好后用addcookie添加到浏览器中,再次读取只会读取当前web资源的cookie</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.cookie在服务器端创建,在浏览器端储存</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.并且可以被多个浏览器共享</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.如果重名就会替换同名的cookie值</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.一个cookie大小限制为4kb,一个站点的cookie个数不超过20个</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 一个浏览器的cookie不超过300个</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 5.setMaxAge:设置生命周期,设置正数,多少秒后失效</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 设置为0,删除这个cookie(设置了之后必须要addcookie才能发挥作用)</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 不设置,生命周期为一个会话;</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 如果设置为负数,相当于默认</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> cookie技术API</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 创建cookie:直接new</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> addcookie:把cookie加入到response,也就是加入到http响应中。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> setMaxAge:设置最大存活时间;如果没有设置保存时间,那么当浏览器关闭cookie就失效了</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getCookits:得到所有的cookie的值,一个数组</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getName:得到名字</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getValue:得到值</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 明文存储:使用MD5算法加密存放,验证密码的时候,对用户输入的密码进行</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> MD5加密再到数据库验证</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> session</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.和cookie相反,session存在于服务器端</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2、第一次访问session就会创建一个session对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.一个浏览器只会用一个session对象,不同的浏览器之间不能</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 互相访问session</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.session的生命周期默认30分钟</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 访问session的两种方式:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.HttpSession.getSession(),然后才可以getattribute属性</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 但是只能得到当前浏览器的 这个需要:session.getAttribute("name") session.setAttribute("name", "fuck");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 通过session调用</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.转向,request转向后直接就得到了session 直接就可以getattribute 这个通过request调用</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.session的周期指的是发呆时间,设置10秒,如果你在10秒内没有动</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> session就自动消失,关闭浏览器,关闭服务器也会自动消失</span></p><p><br/></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 防止用户非法登录到某个页面</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> {</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 在用户登录时可以先记录用户信息,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 把信息存到session里面,如果访问网页得到session信息给NULL</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 就非法了</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> session在浏览器关闭后还在,但是他的sessionID由cookie储存,而服务器不知道session已经无效</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 所以30min后再消失,而服务器未关闭之前,他的ID是由浏览器用cookie存储,所以只需要用cookie来</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 存储ID让session读即可,Cookie cookie = new Cookie("JSESSIONID", session.getId());</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> cookie.setMaxAge(3600);</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> response.addCookie(cookie);</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span class=\"Apple-tab-span\" style=\"font-size: 20px; font-family: 黑体, SimHei; white-space: pre;\"> </span>再次打开浏览器后,浏览器会先查找对应的sessionID,就会找到并连上服务器的ID</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 所以如果禁用了cookie,session就不能再用了。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 而重写URL的方式可以不用cookie吧session传进来</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.先要访问一下session 这样服务器才会创建一个session,才会有sessionID</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.重写URL地址:URL = response.encodeURL("/web资源/网页?...数据等等");</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.接收还是和以前一样</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> }</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">cookie VS session</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.存放的位置</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> cookie存放在客户端的临时文件中</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> session存在服务器内存中,一个session域对象为一个用户浏览器服务</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.安全性</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> cookie是以明文存储,安全性低,但可以用MD5算法加密</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> session存放在服务器的内存中,安全性较强</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.网络传输量</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> cookie会传递信息个月服务器,</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> session不会吧session的属性值传递到服务器</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.生命周期</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> cookie的生命周期是累计的</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> session的生命周期是间隔的,不操作的时间超过设置时间就会消失</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">servletcontext</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> web容器在启动的时候,他会为每个web应用创建一个servletcontext对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 在一个web应用中,所有的servlet公用一个servletcontext对象</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 公共聊天室经常用到</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.servletcontext在服务器中</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.是被所以客户端共享</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.servletcontext是在web应用启动时创建</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 4.servletcontext在服务器关闭的时候,或reload消失</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> this.getservletcontext可以得到servletcontext。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> setattribute可以设置属性</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getattribute可以得到属性</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.servletcontext带有转向功能,和request的转向效果一样</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 2.servletcontext还有路径功能,只能找到服务器下面的路径</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getservletcontext.getrealpath('文件在web资源下的路径')</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 这个方法只能读webroot下面的文件,如果放在SRC下面是读不到的</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.读SRC下面的文件需要用类加载器</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p>2017-12-1817:11:36</p><hr/><p><br/></p><p><br/></p><p><br/></p><p><br/></p>',8,'Servlet'),(15,'JavaScript正则表达式验证邮箱','<!doctype html><html> <head> <meta charset=\"UTF-8\"> <meta name=\"Generator\" content=\"EditPlus®\"> <meta name=\"Author\" content=\"\"> <meta name=\"Keywords\" c','2017-12-18 17:33:49',6,2,'<pre class=\"brush:js;toolbar:false\"><!doctype html>\n<html>\n <head>\n <meta charset="UTF-8">\n <meta name="Generator" content="EditPlus®">\n <meta name="Author" content="">\n <meta name="Keywords" content="">\n <meta name="Description" content="">\n <title>Document</title>\n <script language = "javascript" type = "text/javascript">\n function test1()\n {\n //验证电子邮件\n var con = content.innerText;\nwindow.alert(con);\nvar reg = /^[a-zA-Z0-9_-]+@([a-zA-Z0-9]+\\.)+(com|cn)$/;\nvar get2 = /(\\d){4}/gi;\nwhile(res = reg.exec(con))\n {\n window.alert(res[0]);\n }\n }\n </script>\n </head>\n <body>\n <textarea id = "content" rows = "10" cols = "20"></textarea>\n <input type = "button" onclick = "test1()" value = "查找"/>\n </body>\n</html></pre><p><br/></p>',7,'JavaScript'),(16,'lucene(博客)检索例子','package com.Blog.Luence;import com.Blog.Entity.Blog;import com.Blog.Util.DateUtil;import com.Blog.Util.StringUtil;import org.apache.commons.lang.StringEsca','2017-12-18 17:43:50',5,1,'<pre class=\"brush:java;toolbar:false\">package com.Blog.Luence;\n\nimport com.Blog.Entity.Blog;\nimport com.Blog.Util.DateUtil;\nimport com.Blog.Util.StringUtil;\nimport org.apache.commons.lang.StringEscapeUtils;\nimport org.apache.lucene.analysis.Analyzer;\nimport org.apache.lucene.analysis.TokenStream;\nimport org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;\nimport org.apache.lucene.document.Document;\nimport org.apache.lucene.document.Field;\nimport org.apache.lucene.document.StringField;\nimport org.apache.lucene.document.TextField;\nimport org.apache.lucene.index.*;\nimport org.apache.lucene.queryparser.classic.QueryParser;\nimport org.apache.lucene.search.*;\nimport org.apache.lucene.search.highlight.*;\nimport org.apache.lucene.store.Directory;\nimport org.apache.lucene.store.FSDirectory;\nimport org.jsoup.helper.DataUtil;\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\nimport java.io.IOException;\nimport java.io.StringReader;\nimport java.nio.file.Paths;\nimport java.util.Date;\nimport java.util.LinkedList;\nimport java.util.List;\n/**\n * 用于添加索引\n * luence索引\n */\n@Component\npublic class BlogIndex {\n private Directory directory;\n\n public IndexWriter getwrite() {\n IndexWriter indexWriter = null;\n try {\n directory = FSDirectory.open(Paths.get("D://Luence"));\n SmartChineseAnalyzer smartChineseAnalyzer = new SmartChineseAnalyzer();\n IndexWriterConfig indexWriterConfig = new IndexWriterConfig(smartChineseAnalyzer);\n indexWriter = new IndexWriter(directory, indexWriterConfig);\n return indexWriter;\n } catch (IOException e) {\n e.printStackTrace();\n }\n return indexWriter;\n }\n\n public void addIndex(Blog blog) {\n IndexWriter indexWriter = getwrite();\n Document document = new Document();\n document.add(new StringField("id", String.valueOf(blog.getId()), Field.Store.YES));\n document.add(new TextField("title", blog.getTitle(), Field.Store.YES));\n document.add(new StringField("releasedate", DateUtil.formatDate(new Date(), "yyyy-MM-dd"), Field.Store.YES));\n document.add(new TextField("content", blog.getContentNoTag(), Field.Store.YES));\n try {\n indexWriter.addDocument(document);\n indexWriter.close();\n } catch (IOException e) {\n e.printStackTrace();\n }\n }\n\n public void update(Blog blog)\n {\n IndexWriter indexWriter = getwrite();\n Document document = new Document();\n document.add(new StringField("id", String.valueOf(blog.getId()), Field.Store.YES));\n document.add(new TextField("title", blog.getTitle(), Field.Store.YES));\n document.add(new StringField("releasedate", DateUtil.formatDate(new Date(), "yyyy-MM-dd"), Field.Store.YES));\n document.add(new TextField("content", blog.getContentNoTag(), Field.Store.YES));\n try {\n indexWriter.updateDocument(new Term("id", String.valueOf(blog.getId())),document);\n indexWriter.close();\n } catch (IOException e) {\n e.printStackTrace();\n }\n }\n\n public List<Blog> searchBlog(String search) {\n IndexReader indexReader = null;\n IndexSearcher indexSearcher = null;\n List<Blog> list = null;\n try {\n directory = FSDirectory.open(Paths.get("D://Luence"));\n indexReader = DirectoryReader.open(directory);\n indexSearcher = new IndexSearcher(indexReader);\n BooleanQuery.Builder builder = new BooleanQuery.Builder();\n SmartChineseAnalyzer smartChineseAnalyzer = new SmartChineseAnalyzer();\n //查询标题\n QueryParser queryParser = new QueryParser("title", smartChineseAnalyzer);\n Query query = queryParser.parse(search);\n //查询内容\n QueryParser queryParser1 = new QueryParser("content", smartChineseAnalyzer);\n Query query1 = queryParser1.parse(search);\n\n builder.add(query, BooleanClause.Occur.SHOULD);\n builder.add(query1, BooleanClause.Occur.SHOULD);\n\n TopDocs topDocs = indexSearcher.search(builder.build(), 100);\n QueryScorer queryScorer = new QueryScorer(query);\n Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer);\n SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<b><font color = 'red'>", "</font></b>");\n Highlighter highlighter = new Highlighter(simpleHTMLFormatter, queryScorer);\n highlighter.setTextFragmenter(fragmenter);\n\n list = new LinkedList<>();\n for (ScoreDoc scoreDoc : topDocs.scoreDocs) {\n Document document = indexSearcher.doc(scoreDoc.doc);\n Blog blog = new Blog();\n blog.setId(Integer.parseInt(document.get("id")));\n blog.setReleasedateString(document.get("releasedate"));\n String title = document.get("title");\n String content = StringEscapeUtils.escapeHtml(document.get("content"));\n\n if (title != null) {\n TokenStream tokenStream = smartChineseAnalyzer.tokenStream("title", new StringReader(title));\n String highTitle = highlighter.getBestFragment(tokenStream, title);\n if (StringUtil.isEmpty(highTitle)) {\n blog.setTitle(title);\n } else {\n blog.setTitle(highTitle);\n }\n }\n if (content != null) {\n TokenStream tokenStream = smartChineseAnalyzer.tokenStream("content", new StringReader(content));\n String highcontent = highlighter.getBestFragment(tokenStream, content);\n if (StringUtil.isEmpty(highcontent)) {\n if (content.length() <= 200) {\n blog.setContext(content);\n } else {\n blog.setContext(content.substring(0, 200));\n }\n } else {\n blog.setContext(highcontent.substring(0, 200));\n }\n }\n list.add(blog);\n }\n } catch (Exception e) {\n e.printStackTrace();\n }\n return list;\n }\n\n\n public void delete(String id)\n {\n IndexWriter indexWriter = getwrite();\n try {\n indexWriter.deleteDocuments(new Term("id",id));\n indexWriter.forceMergeDeletes();\n indexWriter.commit();\n indexWriter.close();\n } catch (Exception e) {\n e.printStackTrace();\n }\n }\n}</pre><p><br/></p>',6,'lucene'),(17,'NoSql','nosql -> 不仅仅是SQL即非关系型数据库 ,像淘宝那种大数据的流动和分分钟几十亿的访问量MySQL单个数据库已经无法支撑,无法支撑大数据的访问了。比如Facebook和谷歌几十亿的数据不需要固定模式,无需多余操作就可以横向扩展。\0NoSQL有四种数据模式:kv键值对(key-value键值),bson','2017-12-18 19:39:06',3,0,'<p><span style=\"font-size: 24px; font-family: 黑体, SimHei;\">nosql -> 不仅仅是SQL</span></p><p><span style=\"font-size: 24px; font-family: 黑体, SimHei;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">即非关系型数据库 ,像淘宝那种大数据的流动和分分钟几十亿的访问量MySQL单个数据库已经无法支撑,无法支撑大数据的访问了。比如Facebook和谷歌几十亿的数据不需要固定模式,无需多余操作就可以横向扩展。</span><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">\0NoSQL有四种数据模式:kv键值对(key-value键值),</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">bson(二进制json串),</span></p><p><font face=\"黑体, SimHei\"><span style=\"font-size: 20px;\">列簇(一个key可以对应多个键值对,纵向增长),</span></font></p><p><font face=\"黑体, SimHei\"><span style=\"font-size: 20px;\">图形。</span></font></p><p><font face=\"黑体, SimHei\"><span style=\"font-size: 20px;\"><br/></span></font></p><p><font face=\"黑体, SimHei\"><span style=\"font-size: 20px;\">分布式数据库中CAP:</span></font></p><p><font face=\"黑体, SimHei\"><span style=\"font-size: 20px;\">C:强一致性,也就是原子性</span></font></p><p><font face=\"黑体, SimHei\"><span style=\"font-size: 20px;\">A:高可用性</span></font></p><p><font face=\"黑体, SimHei\"><span style=\"font-size: 20px;\">P:分区容错性</span></font></p><p><font face=\"黑体, SimHei\"><span style=\"font-size: 20px;\">而NoSQL只能3选2,不能同时做到,一般的网站都是选择AP,高可用即网站别炸,分区容错,分布式占了。</span></font></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p>',10,'nosql'),(18,'Redis基础--安装(1)','Redis安装下载Redis后解压把64bitcopy到其中一个盘下,运行cmd吧目录切换到copy的目录下,运行 redis-server.exe redis.conf安装Redis。安装完成会出现0 client connect,表名目前没有人使用Redis。启动另外一个cmd,切换到Redis目录,运行','2017-12-18 22:42:45',7,0,'<h3><span style=\"font-size: 24px;\">Redis安装<br/><br/></span></h3><p><span style=\"font-size: 24px;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"></span>下载Redis后解压把64bitcopy到其中一个盘下,运行cmd吧目录切换到copy的目录下,<br/></span></p><p><span style=\"font-size: 24px;\">运行<span style=\"color: rgb(51, 51, 51); font-family: 微软雅黑, Arial, sans-serif; font-size: 14px; background-color: rgb(255, 255, 255);\"> </span><strong style=\"box-sizing: border-box; color: rgb(51, 51, 51); font-family: 微软雅黑, Arial, sans-serif; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255);\">redis-server.exe redis.conf<span style=\"font-size: 20px; font-family: 黑体, SimHei;\"></span></strong><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">安装Redis。</span></span></p><p><span style=\"font-size: 24px;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">安装完成会出现0 client connect,表名目前没有人使用Redis。</span></span></p><p><span style=\"font-size: 24px;\"><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"><br/></span></span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">启动另外一个cmd,切换到Redis目录,运行<strong style=\"box-sizing: border-box; color: rgb(51, 51, 51); font-family: 微软雅黑, Arial, sans-serif; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255);\">redis-cli.exe -h 127.0.0.1 -p 6379</strong><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">命令,</span></span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">6379是默认这个端口。</span></span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">然后第一个安装Redis的cmd就会出现1 client connect</span></span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">再使用set mykey get mykey就可以取键值。</span></span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">教程地址:http://www.redis.net.cn/tutorial/3503.html</span></span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">2017-12-18 22:42:43</span></span></p>',12,'Redis 缓存'),(19,'Redis基础--基本类型(2)','Redis基本类型Redis默认有16个库,select (0-15)命令可以切换。key:{ 命令: keys *:查找所有的key exists key 名字:查看这个key是不是存在 move key db:移动到哪个库 expire key 秒钟:给key设置过期时间 ttl ','2017-12-18 23:49:58',22,0,'<h2 style=\"white-space: normal;\">Redis基本类型</h2><p><br/></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">Redis默认有16个库,select (0-15)命令可以切换。</span></p><p><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">key:</span><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 命令:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> keys *:查找所有的key</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> exists key 名字:查看这个key是不是存在</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> move key db:移动到哪个库</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> expire key 秒钟:给key设置过期时间</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> ttl key:查看还有多少秒过期,-1永不过期,-2已经过期</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> type key:查看key的类型</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><br/></p><p><br/></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">String类型 单值单value</span><br/></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 这里的string并不是Java的string。</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 1.一个key对应一个value。</span></p><pre class=\"brush:java;toolbar:false\"> SET name "redis.net.cn"</pre><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"></span> <span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> name就是一个键,“Redis.net.cn”就是键值</span></p><p style=\"white-space: normal;\"> <span style=\"font-family: 黑体, SimHei; font-size: 20px;\">2.string是二进制安全的,意思是可以存储任何文件数据,包括图片</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 3.string类型是Redis最基本的类型,最大存储512M</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 命令:</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> set/get/del/append/strlen:设置键,得到键,删除键,追加键,返回键值长度。</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> incr/decr/incrby/decrby:只有数字才可以使用,增加1,减少1,增加多少,减少多少。</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getrange/setrange key_name start end:得到字符串的前几个字母,设置字符串的几个字母。</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> setnx key value:当key不存在时设置value。</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> mset/mget/msetnx:同时设置一个或多个键值对,同时得到一个或多个键值对</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> getset:设置键值对,并且返回旧的键值。</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">Hash类型 和list和set有所不同,KV模式不变,但他的V是一个键值对。</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> hash类型是一个键值对的集合,<span style=\"color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);\">是一个string类型的field和value的映射表,hash特别适合用于存储对象。</span></span></p><pre class=\"brush:java;toolbar:false\">redis 127.0.0.1:6379> HMSET user:1 username redis.net.cn password redis.net.cn points 200\n OK\n redis 127.0.0.1:6379> HGETALL user:1 \n 1) "username"\n 2) "redis.net.cn"\n 3) "password"\n 4) "redis.net.cn"\n 5) "points"\n 6) "200"\n redis 127.0.0.1:6379></pre><p style=\"margin-top: 0px; margin-bottom: 10px; white-space: normal; box-sizing: border-box; line-height: 28px; color: rgb(51, 51, 51); font-family: 微软雅黑, Arial, sans-serif; font-size: 14px; background-color: rgb(255, 255, 255);\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 以上实例中 hash 数据类型存储了包含用户脚本信息的用户对象。 实例中我们使用了 Redis <strong style=\"box-sizing: border-box;\">HMSET, HEGTALL</strong> 命令,<strong style=\"box-sizing: border-box;\">user:1</strong> 为键值。</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><span style=\"color: rgb(51, 51, 51); font-family: 微软雅黑, Arial, sans-serif; font-size: 14px; background-color: rgb(255, 255, 255);\"> 每个 hash 可以存储 2</span><span style=\"box-sizing: border-box; position: relative; font-size: 12px; line-height: 0; vertical-align: baseline; top: -0.5em; color: rgb(51, 51, 51); font-family: 微软雅黑, Arial, sans-serif; background-color: rgb(255, 255, 255);\">32 - 1</span><span style=\"color: rgb(51, 51, 51); font-family: 微软雅黑, Arial, sans-serif; font-size: 14px; background-color: rgb(255, 255, 255);\"> 键值对(40多亿)。</span></span></p><p style=\"white-space: normal;\"><span style=\"color: rgb(51, 51, 51); background-color: rgb(255, 255, 255); font-size: 20px; font-family: 黑体, SimHei;\"></span><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 以上 其实就是多个string的集合:{username redis}</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 命令:</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> hset key key1 value1:就是增加一个键值对<br/></span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> hget key key1 :得到hash的key值</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> hmset/hmget:多值添加和多值索取</span></p><p style=\"white-space: normal;\"><font face=\"黑体, SimHei\"><span style=\"font-size: 20px;\"> hgetall:得到所有的键值对</span></font></p><p style=\"white-space: normal;\"><font face=\"黑体, SimHei\"><span style=\"font-size: 20px;\"> hdel:删除键</span></font></p><p style=\"white-space: normal;\"><font face=\"黑体, SimHei\"><span style=\"font-size: 20px;\"> hlen/hexists:求长度,判断是否存在键值</span></font></p><p style=\"white-space: normal;\"><font face=\"黑体, SimHei\"><span style=\"font-size: 20px;\"> hkeys/hvalues:输出所有的key值,输出所有的value值</span></font></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">list</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </span><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </span><span style=\"font-family: 黑体, SimHei; font-size: 20px; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);\">Redis 列表是简单的字符串列表,按照插入顺序排 序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);\"> </span></p><pre class=\"brush:java;toolbar:false\">redis 127.0.0.1:6379> lpush redis.net.cn redis\n(integer) 1\nredis 127.0.0.1:6379> lpush redis.net.cn mongodb\n(integer) 2\nredis 127.0.0.1:6379> lpush redis.net.cn rabitmq\n(integer) 3\nredis 127.0.0.1:6379> lrange redis.net.cn 0 10\n1) "rabitmq"\n2) "mongodb"\n3) "redis"\nredis 127.0.0.1:6379></pre><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);\"></span><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">命令</span>:<br/></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> lpush/rpush:左添加,右添加。</span><br/></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> lrange key start end:左到右输出。</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> lpop/rpop:左出一个,右出一个。</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> lindex:下标索引,左到右</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> llen:求长度</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> lrem key N value:删除键值中N个值</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> ltrim key start end:截取原来key中的start到end字段重新替换原来的key</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> rpoplpush key1 key2:key1取出右边一个左插入到key2</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> lset key index value:通过索引index改变key里面的某个value</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> linsert key before/after 值1 值2:在值一的·前面或后面插入值二</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"></span></p><h2 style=\"white-space: normal; box-sizing: border-box; font-family: 微软雅黑, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: rgb(51, 51, 51); margin: 14px 0px 8px; font-size: 22px; position: relative; z-index: 1; background-color: rgb(255, 255, 255);\">Set(集合)和list差不多 ,但是set不允许重复</h2><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> set集合是string键值对的无序集合无序集合。</span></p><p style=\"white-space: normal; text-indent: 2em;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">公式:</span></p><pre class=\"brush:sql;toolbar:false\"> sadd key member</pre><p style=\"white-space: normal;\"> <span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 例子</span></p><pre class=\"brush:java;toolbar:false\"> redis 127.0.0.1:6379> sadd redis.net.cn redis\n (integer) 1\n redis 127.0.0.1:6379> sadd redis.net.cn mongodb\n (integer) 1\n redis 127.0.0.1:6379> sadd redis.net.cn rabitmq\n (integer) 1\n redis 127.0.0.1:6379> sadd redis.net.cn rabitmq\n (integer) 0\n redis 127.0.0.1:6379> smembers redis.net.cn\n \n 1) "rabitmq"\n 2) "mongodb"\n 3) "redis"</pre><p style=\"white-space: normal;\"> <span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 把{redis.net.cn,Redis}等等加入到set集合中,如果重复了就返回0</span><br/></p><p style=\"white-space: normal;\"> <span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> sadd是加集合,smembers是输出集合</span></p><p style=\"white-space: normal;\"> <span style=\"font-family: 黑体, SimHei; font-size: 20px;\">命令:</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> sadd/smembers/sismember:增加,输出元素,查看元素是否存在。</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> scard:求set元素个数</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> srem key value:删除集合元素</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> srandmember key n个数:随机出n个数字</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> spop key:随机出栈</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> smove key1 key2 key1的某个值:把key1的某个值移动到key2</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">zset(有序集合)类型</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><pre class=\"brush:sql;toolbar:false\"> zadd key score member</pre><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> 命令:</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> zset:在set的基础上加多一个score</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> zrange:输出zset的范围,后面带withscores将输出score</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> zrangebyscore key score1 score2:输出score1 到 score2范围内的值,不加(是默认包含,加了就是 不包含</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> zrem value:删除元素</span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> </span></p><p style=\"white-space: normal;\"><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span><br/></p><p><br/></p>',12,'Redis基本类型'),(20,'Redis基础--持久化RDB(3)','RDB是什么:在指定时间内将内存中的数据集快照写入磁盘内。恢复时就讲文件读入内存里。Redis会单独创建一个子进程进行持久化操作,会将数据写入到一个临时文件夹之中,等待持久化过程都结束了,再用这个临时文件替换上次写好的文件,整个过程中,主进程不进行如何的IO操作,这就确保了极高的性能。如果需要大规模的数据恢复','2017-12-20 20:14:35',4,0,'<p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">RDB</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">是什么:在指定时间内将内存中的数据集快照写入磁盘内。恢复时就讲文件读入内存里。</span><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">Redis会单独创建一个子进程进行持久化操作,会将数据写入到一个临时文件夹之中,等待持久化过程都结束了,再用这个临时文件替换上次写好的文件,</span><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">整个过程中,主进程不进行如何的IO操作,这就确保了极高的性能。如果需要大规模的数据恢复,且对于数据恢复的完整性不是非常的敏感,那RDB的方式比AOF的方式要高效,RDB的缺点就是最后一次持久化数据可能丢失。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">Fork:fork的作用就是复制一份与当前进程一模一样的进程,数值和原进程一致,但是是一个全新的进程,并且作为原进程的子进程。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">快照RDB存储在配置文件中有配置:<br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">默认配置(面试常问):</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"></span></p><p>save 900 1 <span style=\"font-family: 黑体, SimHei; font-size: 20px;\">900秒内修改一次就存入缓存</span></p><p>save 300 10</p><p>save 60 10000</p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">如果在关闭是时候使用了flushall或者是shutdown,也会像MySQLcommit一样写到dump.rdb 文件中。<br/></span><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">如果不想改配置,也可以手动save命令写入到dump.rbd文件。还有一个bgsave命令,save命令在执行的时候会中断前台输入,而bgsave是异步的,写入dump文件同时也可以前台输入。</span><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">dump.rdb文件的修复:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">和aof一样,可以使用redis-check-dump --fix修复。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">Redis会使用压缩算法吧数据写入了dump.rbd文件,之后会进行数据校验,大约会花费百分之10的性能。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">优缺点:适合大规模数据的恢复,对数据的完整性和一致性要求不高。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">总结:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">1.RDB是一个非常紧凑的文件。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">2.RDB在保存RDB文件的时候唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程完成,父进程不在需要进行任何的IO操作,所以RDB持久化方式可以最大化Redis的性能。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">3.与AOF相比,在恢复大的数据集的时候,RDB方式会更块一点。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">4.数据丢失风险大,容易丢失最后一次的保存</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">5.RDB需要经过fork子进程来保存数据集到硬盘上,当数据比较大的时候,fork的过程是非常耗时的,可能到时一些毫秒级别的不能响应客户端的请求。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p>',12,'Redis基础'),(21,'Redis基础--持久化AOF(4)','AOF1.是什么:已日志的形式记录每一个写操作,写操作不记录,RDB是将结果保存,AOF是保存写操作,读操作如get lrange不保存。将所有Redis的写操作记录指令记录下来,值允许追加文件但不可以改写文件,Redis启动之初会自动读取该文件重新构建数据,换言之,Redis重启的话会根据日志文件的内容从前','2017-12-21 21:01:19',6,0,'<p><span style=\"font-size: 24px; font-family: 黑体, SimHei;\">AOF</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">1.是什么:已日志的形式记录每一个写操作,写操作不记录,RDB是将结果保存,AOF是保存写操作,读操作如get lrange不保存。将所有Redis的写操作记录指令记录下来,值允许追加文件但不可以改写文件,Redis启动之初会自动读取该文件重新构建数据,换言之,Redis重启的话会根据日志文件的内容从前到后执行一次以完成数据的恢复工作。<br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">2.存储文件:appendonly.aof</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">3.要点:AOF和RDB的持久化文件可以共存,即rdb,aof文件可以共存,如果服务器重启,会默认先加载AOF文件,如果AOF文件出错将无法启动Redis,这时候可以调用redis-check-aof --fix <修复aof的文件名>,它会把不符合语法规范的全部删除。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">4.aof配置参数:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">appendonly:aof持久化是否开启,默认是no,不开启。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">appendfilename:aof持久化保存的文件名</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">appendfsync:持久化方式。一共有三种:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Always:同步持久化,每次修改会立刻持久化到appendonly.aof文件,性能较差但数据完整性较高。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> Everysec:出场默认,异步操作,每秒记录,如果一秒钟内出现问题,会数据丢失。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"> No:无持久化方式。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">no-appendfsync-on-rewrite:重写是否默认追加方式,默认no</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">auto-aof-rewrite-percentage: 100,重写aof文件大小的百分比。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">auto-aof-rewrite-min-size: 64mb,aof文件大于多少时重写。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><br/></p><p><br/></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">5.重写机制</span><br/></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">是什么:aof持久化是把写命令设置进去,如果命令过多就会导致aof文件内容过多,所以会存在aof文件过大的情况。所以出现了重写机制,如果命令过多或超过了文件大小,就会触发重写,Redis会调用aof的文件内容压缩,只保留可以恢复数据的最小指令,手动可以使用bgrewriteaof。</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"><br/></span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">重写原理:aof文件持续增大,会fork出一条新的进程来将文件重写(也就是先写临时文件最会再rename),</span><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">遍历新进程的内存中的数据,每条记录有一条set语句,重写aof文件的操作,并母读取旧的aof文件,而是将整个内存中的内容用命令的方式重新写了一个新的aof文件,和快照相似。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">触发机制:Redis会记录上一次的aof文件的大小,默认配置的aof文件大小是上一次rewrite的aof文件大小的一倍,而且大于64M的时候就触发。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">6.劣势:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">aof的文件远大于RDB文件,恢复效率也比RDB的慢。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">7.总结:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">1.aof文件是一个只进行追加的日志文件。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">2.Redis可以在aof文件体积变的过大的时候自动的在后台对aof进行重写。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">3.aof文件有序的保存了对数据库的执行所有写入操作,这些写入操作以Redis协议的格式保存,因此aof文件的内容非常容易被人读懂,对文本分析十分简单。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">4.对于相同的数据集,aof的文件大小远大于RDB。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">5.根据所使用的fsync策略,aof速度慢于RDB。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">6.如果dump和aof同时存在,会优先加载aof。</span></p>',12,'Redis基础'),(22,'Redis基础--事务(5)','事务是什么:可以一次执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会系列化,按顺序地执行而不会被其他命令插入不许加塞。事务常用命令:{ discard:取消事务,放弃执行事务块内的命令。 exec:执行事务块内的命令。 multi:标记一个事务块的开始。 unwatch:取消wat','2017-12-22 22:47:20',5,0,'<p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">事务</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">是什么:可以一次执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会系列化,按顺序地执行而不会被其他命令插入不许加塞。</span><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">事务常用命令:<br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"></span><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> discard:取消事务,放弃执行事务块内的命令。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> exec:执行事务块内的命令。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> multi:标记一个事务块的开始。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> unwatch:取消watch命令对所有key的监控。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> watch key{key。。。}:监控一个或多个key,如果在事务执行之前这个key被其他命 令所改动,那么事务被打断。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">事务处理基本流程</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> 首先:MULTI命令开启事务,之后开始基本的处理操作,如果没有错误,将会返回 QUEEN,意思是已经加入了队列,等待执行。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> 操作:如果不想执行或中介步骤错了,可以使用discard打断。如果有Redis语法错误, 整个事务都会被终止。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">}</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">Redis事务有5个状态<br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">{</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> case 1:正常执行 multi开启事务,exec执行事务队列。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> case 2:放弃事务 multi开启事务后discard结束事务。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> case 3:全体连坐 multi开启事务后,发现有Redis语法错误,也就是类似getset key,后面没有value,无法加入队列,事务结束。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> case 4:冤头债主 multi开启事务后,并且exec执行了,发现有异常,而这些异常不 是加入队列就可以发现的,而是执行才知道的,错误语句不执行,其他照旧,和上面 的语法错误有区别。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> case 5:watch监控 watch的作用是监控所有的key,保证他们不被其他线程所修改, 假如现在key-value是80,添加了watch监控后开启事务,在事务过程中,value被其他 线程修改了,这时watch就被检测到,于是打断事务,exec也没有用。这就类似于乐观 锁,等于在exec的时候他对比版本号的意思。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"> case 6:unwatch取消监控。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">}</span><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"><br/></span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">总结:</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">1.在exec和unwatch后,监控锁都会被清理掉。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">2.单独的隔离操作:事务中的所以命令都会序列化,按顺序的执行。事务在执的过程中,不会被其他客户端发来的命令所打断。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">3.没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行。</span></p><p><span style=\"font-family: 黑体, SimHei; font-size: 24px;\">4.不保证原子性:Redis同一个事务中如果一条命令执行失败,其后的命令仍然会被执行,没有回滚操作。</span></p>',12,'Redis基础 事务'),(23,'数据库悲观锁和乐观锁','数据库基础悲观锁悲观锁就是悲观的认为,每一次修改操作都会出现线程的冲突访问,也就是并发。所以每一次操作都会锁住数据,只有等这个事务处理完了才解锁,而在锁的过程中其他的事务会被挂起。这是旧的处理并发的方式,表锁,行锁都是锁住数据,想修改数据只有拿到这个锁你才可以修改数据。比如Java关键字 synchroniz','2017-12-23 16:12:13',7,0,'<p><span style=\"font-size: 24px; font-family: 微软雅黑, "Microsoft YaHei";\">数据库基础</span><span style=\"font-family: 黑体, SimHei; font-size: 24px;\"><br/></span></p><p><br/></p><p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\">悲观锁</span><br/></p><p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\">悲观锁就是悲观的认为,每一次修改操作都会出现线程的冲突访问,也就是并发。所以每一次操作都会锁住数据,只有等这个事务处理完了才解锁,而在锁的过程中其他的事务会被挂起。这是旧的处理并发的方式,表锁,行锁都是锁住数据,想修改数据只有拿到这个锁你才可以修改数据。比如Java关键字 synchronized.</span></p><p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\">乐观锁</span></p><p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\">乐观锁就是乐观都认为在一开始取数据是不会有冲突,在提交的时候才检测冲突。一般有三种方式处理乐观锁:</span></p><p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\">1.在取数据的时候把整个数据都copy到应用中,在进行提交的时候对比当前数据库的数据和你一开是取到的数据,这里的一开始取的数据是指你未修改的,如果相同了就没有并发冲突,执行提交修改,否则业务操作处理。</span></p><p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\"><br/></span></p><p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\">2.是在数据库表的后面加上一个版本号version,提交的版本号一定要大于原数据库的才可以。比如1 2号员工要修改,原数据库版本号是1,两个员工发生了并发,都拿到了1号版本的数据,但是1号员工比2号快0.几秒提交了,于是先修改了,而1号员工的版本号是2号了,因为他已经发生了修改,并且提交了。2版本号大于原数据库版本号,修改成功。而2号员工提交也是2号版本,并没有大于原数据库版本2号,所以驳回,需要业务手动处理。</span><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\"></span><br/></p><p><span style=\"font-family: 黑体, SimHei; font-size: 20px;\">3.<span style=\"font-size: 20px; color: rgb(69, 69, 69); background-color: rgb(255, 255, 255); font-family: 微软雅黑, "Microsoft YaHei";\">第三种做法和第二种做法有点类似,就是也新增一个Table的Column,不过这次这个column是采用timestamp型,存储数据最后更新的时间。在Oracle9i以后可以采用新的数据类型,也就是timestamp with time zone类型来做时间戳。这种Timestamp的数据精度在Oracle的时间类型中是最高的,精确到微秒(还没与到纳秒的级别),一般来说,加上数据库处理时间和人的思考动作时间,微秒级别是非常非常够了,其实只要精确到毫秒甚至秒都应该没有什么问题。和刚才的版本戳类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。如果不想把代码写在程序中或者由于别的原因无法把代码写在现有的程序中,也可以把这个时间戳乐观锁逻辑写在Trigger或者存储过程中</span></span></p><p><br/></p>',10,'数据库 锁'),(24,'Redis基础--主从复制(6)','Redis主从复制 是什么:主从复制是主机数据更新之后根据配置和策略自动同步到备机的master/slaver机制,Master以写为主,slave以读为主。基本操作:1、配从库不配主库。2.从库配置:slaveof 主库 IP 主库端口{ 每次与master断开之后要重新连接','2017-12-23 19:56:57',4,1,'<p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 24px;\">Redis主从复制</span><br/></p><p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 24px;\"> </span></p><p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\">是什么:主从复制是主机数据更新之后根据配置和策略自动同步到备机的master/slaver机制,Master以写为主,slave以读为主。</span></p><p><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\"><br/></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\">基本操作:</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\">1、配从库不配主库。</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\">2.从库配置:slaveof 主库 IP 主库端口</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\">{</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\"> 每次与master断开之后要重新连接,除非是在配置文件里面配置了。</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\"> Info replication</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\">}</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\">3.修改配置文件的细节操作:{</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\"> 1,拷贝多个Redis.conf文件;</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\"> 2,开启daemonize yes;window不支持</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\"> 3,Pid文件的名字;window不支持</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\"> 4,指定端口;</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\"> 5,log文件的名字;</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\"> 6</span></span><span style=\"font-size: 20px; font-family: 微软雅黑, "Microsoft YaHei";\">,Dump.rdb的名字;</span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\">}</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\"><br/></span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\">Redis主从复制常用操作</span></span></p><p><span style=\"font-family:微软雅黑, Microsoft YaHei\"><span style=\"font-size: 20px;\">{</span></span></p><p><span style=\"font-size: 20px; font-family: 微软雅黑, "Microsoft YaHei";\"> 1.一主二仆:一个主要的Redis数据库,两个用于备份,复制主数据库瘫痪数据丢失。从数据库首先要执 行<span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\">slaveof 主库 IP 主库端口命令与主库连上,之后会自动复制主库的内容,第一次是全部复制,把主库 的内容从头到尾复制过来,之后就是追加即可。其次,从库不能修改内容,即不能添加或修改,只能 get,只起一个备份作用。再次,如果主库被下线,即shutdown命令关闭,则从库会等待,属于待命状 态,主库上线立刻跟上。但从库下线后,再次上线后想连上主库回到主从关系必须重新设置slaveof命 令,除非配置文件配置了。(info replication可以用于查看主从状态以及其他信息)</span></span></p><p><span style=\"font-size: 20px; font-family: 微软雅黑, "Microsoft YaHei";\"><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\"><br/></span></span></p><p><span style=\"font-size: 20px; font-family: 微软雅黑, "Microsoft YaHei";\"><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\"> 2.薪火相传:一个slave也可以作为一个master与其他的slave连上,但他的角色还是slave,也是只能read 不能写,这样可以去中心化,减少主库的压力。</span></span></p><p><span style=\"font-size: 20px; font-family: 微软雅黑, "Microsoft YaHei";\"><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\"><br/></span></span></p><p><span style=\"font-size: 20px; font-family: 微软雅黑, "Microsoft YaHei";\"><span style=\"font-family: 微软雅黑, "Microsoft YaHei"; font-size: 20px;\"> 3.反客为主:当一个主库下线了之后,可以选择主库其中的一个从库作为主库,使用slaveof no one,就 可以,这时候他线下的所有slave都会与这个代理主库同步。但是如果是在主库没有下线前和从库同级的从 库想要与这个代理库同步,就必须重新执行slaveof 命令。但是如果主库又重新连上了,将不会与代理从 库有联系了。两个都是主库但是没有联系了。</span></span></p><p><span style=\"font-size: 20px; font-family: 微软雅黑, "Microsoft YaHei";\">}</span></p><p><span style=\"font-size: 20px; font-family: 微软雅黑, "Microsoft YaHei";\"><br/></span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">复制原理</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">{</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 1.slave启动之后并成功连接master之后会发送一个sync命令。</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 2.master接到命令启动后台的存盘进程,同上收集所有接受到用于修改数据集的命令,在后台进程执行 完毕之后,master将传递整个数据文件到slave,以完成一次完全的同步。</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 3.全量复制:而slave服务在接受到数据文件后,将其存盘并加载到内存中。</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 4.增量复制:master继续将新的所有收集到的命令依次传给slave,完成同步。</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 5.只要是连上master,第一次都会全量复制,包括断开重连。</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">}</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"><br/></span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">主从复制这些都是比较久的技术了,目前一般都是哨兵模式,其实就是反客为主的自动版。<br/></span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">哨兵模式</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">{</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 操作步骤</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> {</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 1.创建配置文件sentinel.conf</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 2.添加内容,格式:sentinel monitor 主库名字 IP 端口 1 其中1代表如果主库挂起,将投票选择最高票数的从库代替主库。</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 3.启动哨兵:Redis-sentinel sentinel配置文件。 </span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> }</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"><br/></span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\"> 注意事项:</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei; text-decoration: underline;\"> 主库挂了,投票选出最好的从库后,主库再回来,他的角色不会回到原来的master,只会作为目前 master主库的一个从库slave。</span></p><p><span style=\"font-size: 20px; font-family: 黑体, SimHei;\">}</span></p>',12,'Redis基础 主从复制');
/*Table structure for table `blogger` */
DROP TABLE IF EXISTS `blogger`;
CREATE TABLE `blogger` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`profile` text,
`nickname` varchar(50) DEFAULT NULL,
`sign` varchar(100) DEFAULT NULL,
`image` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*Data for the table `blogger` */
insert into `blogger`(`id`,`username`,`password`,`profile`,`nickname`,`sign`,`image`) values (1,'admin','fad87362d1b52d39cd3be62f40e3262e','<ul class=\"lemmaWgt-lemmaTitle lemmaWgt-lemmaTitle- list-paddingleft-2\" style=\"margin: 0px 0px 10px; padding: 0px; width: 700px; font-family: arial, tahoma, "Microsoft Yahei", 宋体, sans-serif; color: rgb(51, 51, 51); font-size: 15px; white-space: normal; background-color: rgb(255, 255, 255);\"><li><h1 style=\"font-size: 32px; font-weight: bold; border-bottom: 2px solid rgb(204, 204, 204); padding: 0px 4px 0px 0px; text-align: center; margin: 0px 0px 20px;\">金刚狼</h1><p> </p></li></ul><p>金刚狼(Wolverine)是美国<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E6%BC%AB%E5%A8%81\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">漫威</a>漫画旗下<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E8%B6%85%E7%BA%A7%E8%8B%B1%E9%9B%84/1253\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">超级英雄</a>,初次登场于《不可思议的浩克》(The Incredible Hulk)第180期(1974年10月)。本名<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E8%A9%B9%E5%A7%86%E6%96%AF%C2%B7%E8%B1%AA%E5%88%A9%E7%89%B9\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">詹姆斯·豪利特</a> / <a target=\"_blank\" href=\"https://baike.baidu.com/item/%E7%BD%97%E6%A0%B9%C2%B7%E8%B1%AA%E5%88%A9%E7%89%B9\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">罗根·豪利特</a>(James Howlett / Logan Howlett),十九世纪出生于<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E5%8A%A0%E6%8B%BF%E5%A4%A7/145973\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">加拿大</a>的<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E9%98%BF%E5%B0%94%E4%BC%AF%E5%A1%94%E7%9C%81\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">阿尔伯塔省</a>,自从儿时发现自己的生父杀死自己的养父后,罗根的<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E5%8F%98%E7%A7%8D%E4%BA%BA/9758142\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">变种人</a>能力便开始显现出来,他拥有延缓衰老和极强的自愈能力,双手还可以伸出骨爪。后来被<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E5%A8%81%E5%BB%89%C2%B7%E5%8F%B2%E5%B4%94%E5%85%8B\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">威廉·史崔克</a>抓走并对其实施<a target=\"_blank\" href=\"https://baike.baidu.com/item/X%E6%AD%A6%E5%99%A8/20494001\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">X武器</a>计划、骨骼被注入<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E8%89%BE%E5%BE%B7%E6%9B%BC%E5%90%88%E9%87%91\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">艾德曼合金</a>,手上的骨爪被无坚不摧的刚爪所取代。这使得罗根正式成为<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E9%87%91%E5%88%9A%E7%8B%BC/83444\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">金刚狼</a>(Wolverine),之后他加入了<a target=\"_blank\" href=\"https://baike.baidu.com/item/X%E6%88%98%E8%AD%A6/25050\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">X战警</a>和<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E5%A4%8D%E4%BB%87%E8%80%85%E8%81%94%E7%9B%9F/391050\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">复仇者联盟</a>等超级英雄团队。<span style=\"font-size: 15px; line-height: 0; position: relative; vertical-align: baseline; top: -0.5em; margin-left: 2px; color: rgb(51, 102, 204); cursor: default; padding: 0px 2px;\">[1]</span><a class=\"sup-anchor\" style=\"color: rgb(19, 110, 194); position: relative; top: -50px; font-size: 0px; line-height: 0;\"> </a></p><p>因为中国观众有需要商业效应的传统,所以将“Wolverine”译为“金刚狼”,而“Wolverine”的正确翻译是“<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E7%8B%BC%E7%8D%BE\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">狼獾</a>”,罗根用这种动物的名字,来作为身材矮小但强壮好斗的自己的超级英雄名。<span style=\"font-size: 15px; line-height: 0; position: relative; vertical-align: baseline; top: -0.5em; margin-left: 2px; color: rgb(51, 102, 204); cursor: default; padding: 0px 2px;\">[1]</span><a class=\"sup-anchor\" style=\"color: rgb(19, 110, 194); position: relative; top: -50px; font-size: 0px; line-height: 0;\"> </a></p><p>在2016年漫画《金刚狼之死》中,金刚狼因失去自愈因子被<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E8%89%BE%E5%BE%B7%E6%9B%BC%E9%87%91%E5%B1%9E\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">艾德曼金属</a>覆盖全身,窒息而死,后来金刚狼在全新全异宇宙复活。在全新全异系列中漫威从《<a target=\"_blank\" href=\"https://baike.baidu.com/item/%E9%87%91%E5%88%9A%E7%8B%BC_%E6%9A%AE%E7%8B%BC%E5%AF%BB%E4%B9%A1\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">金刚狼_暮狼寻乡</a>》宇宙中,将老年版罗根带回主宇宙,暮年罗根在搞清自己来到了不同的过去后,暂时与<a target=\"_blank\" href=\"https://baike.baidu.com/item/X%E6%88%98%E8%AD%A6/25050\" style=\"color: rgb(19, 110, 194); text-decoration: none;\">X战警</a>共同活动。<span style=\"font-size: 15px; line-height: 0; position: relative; vertical-align: baseline; top: -0.5em; margin-left: 2px; color: rgb(51, 102, 204); cursor: default; padding: 0px 2px;\">[2]</span><a class=\"sup-anchor\" style=\"color: rgb(19, 110, 194); position: relative; top: -50px; font-size: 0px; line-height: 0;\"> </a></p><p>2017-12-18 19:49:42</p>','绿箭侠','I am admin','20171218125705.png');
/*Table structure for table `blogtype` */
DROP TABLE IF EXISTS `blogtype`;
CREATE TABLE `blogtype` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`typename` varchar(100) NOT NULL,
`orderno` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
/*Data for the table `blogtype` */
insert into `blogtype`(`id`,`typename`,`orderno`) values (1,'JAVASE',1),(2,'JAVAEE',2),(3,'Spring',3),(4,'SpringMVC',5),(5,'Mybatis',5),(6,'SSM框架整合',6),(7,'前端',7),(8,'服务器类',8),(9,'Shiro',8),(10,'数据库类',10),(11,'分布式',11),(12,'缓存cache',11);
/*Table structure for table `comment` */
DROP TABLE IF EXISTS `comment`;
CREATE TABLE `comment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userIp` varchar(50) DEFAULT NULL,
`blogId` int(11) NOT NULL,
`content` varchar(1000) NOT NULL,
`commentDate` datetime DEFAULT NULL,
`state` int(5) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `blogid` (`blogId`),
CONSTRAINT `blogid` FOREIGN KEY (`blogId`) REFERENCES `blog` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
/*Data for the table `comment` */
insert into `comment`(`id`,`userIp`,`blogId`,`content`,`commentDate`,`state`) values (5,'127.0.0.1',24,'Windows下的Redis配置集群需要复制几个Redis安装文件,不能直接加载配置文件,因为Windows下的Redis不支持Redis.pid','2017-12-24 13:41:30',1);
/*Table structure for table `link` */
DROP TABLE IF EXISTS `link`;
CREATE TABLE `link` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`linkname` varchar(100) DEFAULT NULL,
`linkurl` varchar(100) DEFAULT NULL,
`order` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*Data for the table `link` */
insert into `link`(`id`,`linkname`,`linkurl`,`order`) values (1,'百度搜索','https://www.baidu.com/',1),(2,'360搜索','https://www.so.com/',2),(3,'必应搜索','http://cn.bing.com/',3),(4,'搜狗搜索','https://www.sogou.com/',4);
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;