[TOC]
# 什么是 JavaBean
JavaBean 是一个遵循特定写法的 Java 类,它通常具有如下特点:
* 这个 Java 类必须具有一个无参的构造函数。
* 属性必须私有化。
* 私有化的属性必须通过 public 类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
~~~
public class Person {
//------------------Person类封装的私有属性---------------------------------------
private String name = "aaa"; // getClass()
private int age;
private Date birthday;
//---------------------------------------------------------
//------------------Person类的无参数构造方法---------------------------------------
public Person() {
super();
// TODO Auto-generated constructor stub
}
//---------------------------------------------------------
//------------------Person类对外提供的用于访问私有属性的public方法---------------------------------------
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//---------------------------------------------------------
}
~~~
JavaBean 在 J2EE 开发中,通常用于封装数据,对于遵循以上写法的 JavaBean 组件,其它程序可以通过反射技术实例化 JavaBean 对象,并且通过反射那些遵守命名规范的方法,从而获知 JavaBean 的属性,进而调用其属性保存数据。
## JavaBean 的属性
JavaBean 的属性可以是任意类型,并且一个 JavaBean 可以有多个属性。每个属性通常都需要具有相应的 setter、 getter 方法,setter 方法称为属性修改器,getter 方法称为属性访问器。
属性修改器必须以小写的 set 前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,name 属性的修改器名称为 setName,password 属性的修改器名称为 setPassword。
属性访问器通常以小写的 get 前缀开始,后跟属性名,且属性名的第一个字母也要改为大写,例如,name
属性的访问器名称为 getName,password 属性的访问器名称为 getPassword。
一个 JavaBean 的某个属性也可以只有 set 方法或 get 方法,这样的属性通常也称之为只写、只读属性。
# JSP 中使用 JavaBean
JSP 技术提供了三个关于 JavaBean 组件的动作元素,即 JSP 标签,它们分别为:
* `<jsp:useBean>`标签:用于在 JSP 页面中查找或实例化一个 JavaBean 组件。
* `<jsp:setProperty>`标签:用于在 JSP 页面中设置一个 JavaBean 组件的属性。
* `<jsp:getProperty>`标签:用于在 JSP 页面中获取一个 JavaBean 组件的属性。
## `<jsp:useBean>`标签
`<jsp:useBean>`标签用于在指定的域范围内查找指定名称的 JavaBean 对象:
* 如果存在则直接返回该 JavaBean 对象的引用。
* 如果不存在则实例化一个新的 JavaBean 对象并将它以指定的名称存储到指定的域范围中
~~~
<jsp:useBean id="beanName" class="package.class" scope="page|request|session|application"/>
~~~
* id 属性用于指定 JavaBean 实例对象的引用名称和其存储在域范围中的名称。
* class 属性用于指定 JavaBean 的完整类名(即必须带有包名)。
* scope 属性用于指定 JavaBean 实例对象所存储的域范围,其取值只能是 page、request、session 和 application 等四个值中的一个,其默认值是 page
`<jsp:useBean>`标签使用范例:
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp:userbean标签的使用</title>
</head>
<body>
<jsp:useBean id="person" class="cn.domain.Person" scope="page" />
<%=person.getName() %>
</body>
</html>
~~~
运行结果如下:
![](https://box.kancloud.cn/2572ce631ea8fbda8768d7e3d30ebe6b_460x150.png)
`<jsp:useBean>`执行原理
上面我们在 1.jsp 中使用
~~~
<jsp:useBean id="person" class="cn.domain.Person" scope="page" />
~~~
实例化了一个 cn.domain.Person 类的对象,那么这个 person 对象是怎么实例化出来的呢?1.jsp 在执行的过程中首先会翻译成一个 servlet,因此我们可以通过查看 1.jsp 页面生成的 servlet 的 java 代码来查看 person 对象的实例化过程。
找到 tomcat 服务器下的 “work\Catalina\localhost\项目名称 \org\apache\jsp” 这个目录,就可以看到将 1.jsp 页面翻译成 servlet 的 java 源码了,如下所示:
使用 Sublime Text 打开_1_jsp.java 文件,在_jspService 方法中可以看到 person 对象的创建过程,如下所示:
~~~
cn.domain.Person person = null;
person = (cn.itcast.domain.Person) _jspx_page_context.getAttribute("person", javax.servlet.jsp.PageContext.PAGE_SCOPE);
if (person == null){
person = new cn.itcast.domain.Person();
_jspx_page_context.setAttribute("person", person, javax.servlet.jsp.PageContext.PAGE_SCOPE);
}
~~~
下面我们来分析一下上述生成的代码:
首先是定义一个 person 对象,值是 null。
~~~
cn.domain.Person person = null; // 定义一个空的person对象
~~~
然后是使用 pageContext 对象的 getAttribute 方法获取存储在 `PageContext.PAGE_SCOPE` 域中的 Person 对象。
~~~
person = (cn.domain.Person) _jspx_page_context.getAttribute("person", javax.servlet.jsp.PageContext.PAGE_SCOPE);
~~~
如果在 PageContext.PAGE_SCOPE 域中的 Person 对象没有找到,那么就创建一个新的 person 对象,然后使用 pageContext 对象的 setAttribute 方法将新创建的 person 存储在 PageContext.PAGE_SCOPE 域中。
~~~
if (person == null){
person = new cn.itcast.domain.Person();
_jspx_page_context.setAttribute("person", person, javax.servlet.jsp.PageContext.PAGE_SCOPE);
}
~~~
也就是说,在 1.jsp 中使用
~~~
<jsp:useBean id="person" class="cn.domain.Person" scope="page" />
~~~
来实例化 person 对象的过程实际上是执行了上述的 java 代码来实例化 Person 对象。这就是`<jsp:useBean>`标签的执行原理:” 首先在指定的域范围内查找指定名称的 JavaBean 对象,如果存在则直接返回该 JavaBean 对象的引用,如果不存在则实例化一个新的 JavaBean 对象并将它以指定的名称存储到指定的域范围中。
注意:`<jsp:useBean>`标签的标签体只在`<jsp:useBean>`标签实例化 bean 时才执行。
如以下 1.jsp 代码:
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp:userbean标签的使用</title>
</head>
<body>
<!-- userbean标签的标签体只在userbean标签实例化bean时才执行 -->
<jsp:useBean id="person" class="cn.domain.Person" scope="page">
bbbbbb
</jsp:useBean>
<br/>
<%=person.getName() %>
</body>
</html>
~~~
运行结果如下:
![](https://box.kancloud.cn/9a4a6d8072d5f5272c53e732761197c5_351x145.png)
若将以上 1.jsp 代码修改为:
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp:userbean标签的使用</title>
</head>
<body>
<!-- userbean标签的标签体只在userbean标签实例化bean时才执行 -->
<jsp:useBean id="person" class="cn.domain.Person" scope="session">
bbbbbb
</jsp:useBean>
<br/>
<%=person.getName() %>
</body>
</html>
~~~
第一次运行结果仍不变,但第二次运行时结果如下图
![](https://box.kancloud.cn/690ba333c5d6dd1917d3bfe98ea971a0_211x140.png)
原因是:第一次运行时,JavaBean 对象不存在则实例化一个新的 JavaBean 对象并将它以指定的名称存储到指定的域范围 session 中;第二次运行时,在指定的域范围 session 内就已经查找到指定名称的 JavaBean 对象,所以不会再创建一个新的 JavaBean 对象,即`<jsp:useBean>`标签的标签体只在`<jsp:useBean>`标签实例化 bean 时才执行。
带标签体的`<jsp:useBean>`标签
语法:
~~~
<jsp:useBean ...>
Body
</jsp:useBean>
~~~
功能:Body 部分的内容只在`<jsp:useBean>`标签创建 JavaBean 的实例对象时才执行。以上例子已证明过
## `<jsp:setProperty>`标签
`<jsp:setProperty>`标签用于设置和访问 JavaBean 对象的属性。
语法格式一:
~~~
<jsp:setProperty name="beanName" property="propertyName" value="string字符串"/>
~~~
语法格式二:
~~~
<jsp:setProperty name="beanName" property="propertyName" value="<%= expression %>" />
~~~
语法格式三:
~~~
<jsp:setProperty name="beanName" property="propertyName" param="parameterName"/>
~~~
语法格式四:
~~~
<jsp:setProperty name="beanName" property= "*" />
~~~
* name 属性用于指定 JavaBean 对象的名称。
* property 属性用于指定 JavaBean 实例对象的属性名。
* value 属性用于指定 JavaBean 对象的某个属性的值,value 的值可以是字符串,也可以是表达式。为字符串时,该值会自动转化为 JavaBean 属性相应的类型,如果 value 的值是一个表达式,那么该表达式的计算结果必须与所要设置的 JavaBean 属性的类型一致。
* param 属性用于将 JavaBean 实例对象的某个属性值设置为一个请求参数值,该属性值同样会自动转换成要设置的 JavaBean 属性的类型。
`<jsp:setProperty>`标签使用范例 1:使用 jsp:setProperty 标签设置 person 对象的属性值——手工为 bean 属性赋值 。
~~~
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp:setProperty标签使用范例</title>
</head>
<body>
<jsp:useBean id="person" class="cn.domain.Person" />
<%-- 使用jsp:setProperty标签设置person对象的属性值
jsp:setProperty在设置对象的属性值时会自动把字符串转换成8种基本数据类型
但是jsp:setProperty对于复合数据类型无法自动转换
--%>
<jsp:setProperty property="name" name="person" value="x"/>
<jsp:setProperty property="age" name="person" value="23"/>
<%--
birthday属性是一个Date类型,这个属于复合数据类型,因此无法将字符串自动转换成Date ,用下面这种写法是会报错的
<jsp:setProperty property="birthday" name="person" value="1980-09-12"/>
--%>
<jsp:setProperty property="birthday" name="person" value="<%=new Date() %>"/>
<%--使用getXxx()方法获取对象的属性值 --%>
<h2>姓名:<%=person.getName() %></h2>
<h2>年龄:<%=person.getAge() %></h2>
<h2>生日:<%=person.getBirthday() %></h2>
</body>
</html>
~~~
`<jsp:setProperty`>标签使用范例 2:使用请求参数为 bean 的属性赋值。
~~~
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp:setProperty标签使用范例</title>
</head>
<body>
<jsp:useBean id="person" class="cn.domain.Person" />
<%-- jsp:setProperty标签可以使用请求参数为bean的属性赋值
param="name"用于接收参数名为name的参数值,然后将接收到的值赋给name属性 --%>
<jsp:setProperty property="name" name="person" param="name"/>
<%--使用getXxx()方法获取对象的属性值 --%>
<h2>姓名:<%=person.getName() %></h2>
</body>
</html>
~~~
又如:
~~~
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp:setProperty标签使用范例</title>
</head>
<body>
<jsp:useBean id="person" class="cn.domain.Person" />
<%-- jsp:setProperty标签可以使用请求参数为bean的属性赋值 --%>
<jsp:setProperty property="name" name="person" param="name"/>
<jsp:setProperty property="age" name="person" param="age"/> <%-- 支持8种基本数据类型的转换(把客户机提交的字符串,转成相应的8种基本数据类型,赋到bean的属性上) --%>
<%--使用getXxx()方法获取对象的属性值 --%>
<h2>姓名:<%=person.getName() %></h2>
<h2>年龄:<%=person.getAge() %></h2>
</body>
</html>
~~~
`<jsp:setProperty>`标签使用范例 3:用所有的请求参数为 bean 的属性赋值。
~~~
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp:setProperty标签使用范例</title>
</head>
<body>
<jsp:useBean id="person" class="cn.domain.Person" />
<%-- jsp:setProperty标签用所有的请求参数为bean的属性赋值
property="*"代表bean的所有属性 --%>
<jsp:setProperty property="*" name="person"/>
<%--使用getXxx()方法获取对象的属性值 --%>
<h2>姓名:<%=person.getName() %></h2>
<h2>年龄:<%=person.getAge() %></h2>
</body>
</html>
~~~
注意:请求参数的名称和 bean 的属性名称一定要一致,内部用的是反射技术。
## `<jsp:getProperty>`标签
`<jsp:getProperty>`标签用于读取 JavaBean 对象的属性,也就是调用 JavaBean 对象的 getter 方法,然后将读取的属性值转换成字符串后插入进输出的响应正文中。
语法:
~~~
<jsp:getProperty name="beanInstanceName" property="PropertyName" />
~~~
* name 属性用于指定 JavaBean 实例对象的名称,其值应与<jsp:useBean>标签的 id 属性值相同。
* property 属性用于指定 JavaBean 实例对象的属性名。
如果一个 JavaBean 实例对象的某个属性的值为 null,那么,使用`<jsp:getProperty>`标签输出该属性的结果将是一个内容为 “null” 的字符串。
~~~
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp:setProperty标签使用范例</title>
</head>
<body>
<jsp:useBean id="person" class="cn.domain.Person" />
<%-- 使用jsp:setProperty标签设置person对象的属性值
jsp:setProperty在设置对象的属性值时会自动把字符串转换成8种基本数据类型
但是jsp:setProperty对于复合数据类型无法自动转换
--%>
<jsp:setProperty property="name" name="person" value="李阿昀"/>
<jsp:setProperty property="age" name="person" value="23"/>
<%--
birthday属性是一个Date类型,这个属于复合数据类型,因此无法将字符串自动转换成Date ,用下面这种写法是会报错的
<jsp:setProperty property="birthday" name="person" value="1980-09-12"/>
--%>
<jsp:setProperty property="birthday" name="person" value="<%=new Date() %>"/>
<%--使用jsp:getProperty标签获取对象的属性值 --%>
<h2>姓名:<jsp:getProperty property="name" name="person"/></h2>
<h2>年龄:<jsp:getProperty property="age" name="person"/></h2>
<h2>生日:<jsp:getProperty property="birthday" name="person"/></h2>
</body>
</html>
~~~
- 基础
- 编译和安装
- classpath到底是什么?
- 编译运行
- 安装
- sdkman多版本
- jabba多版本
- java字节码查看
- 数据类型
- 简介
- 整形
- char和int
- 变量和常量
- 大数值运算
- 基本类型包装类
- Math类
- 内存划分
- 位运算符
- 方法相关
- 方法重载
- 可变参数
- 方法引用
- 面向对象
- 定义
- 继承和覆盖
- 接口和抽象类
- 接口定义增强
- 内建函数式接口
- 多态
- 泛型
- final和static
- 内部类
- 包
- 修饰符
- 异常
- 枚举类
- 代码块
- 对象克隆
- BeanUtils
- java基础类
- scanner类
- Random类
- System类
- Runtime类
- Comparable接口
- Comparator接口
- MessageFormat类
- NumberFormat
- 数组相关
- 数组
- Arrays
- string相关
- String
- StringBuffer
- StringBuilder
- 正则
- 日期类
- Locale类
- Date
- DateFormat
- SimpleDateFormat
- Calendar
- 新时间日期API
- 简介
- LocalDate,LocalTime,LocalDateTime
- Instant时间点
- 带时区的日期,时间处理
- 时间间隔
- 日期时间校正器
- TimeUnit
- 用yyyy
- 集合
- 集合和迭代器
- ArrayList集合
- List
- Set
- 判断集合唯一
- Map和Entry
- stack类
- Collections集合工具类
- Stream数据流
- foreach不能修改内部元素
- of方法
- IO
- File类
- 字节流stream
- 字符流Reader
- IO流分类
- 转换流
- 缓冲流
- 流的操作规律
- properties
- 序列化流与反序列化流
- 打印流
- System类对IO支持
- commons-IO
- IO流总结
- NIO
- 异步与非阻塞
- IO通信
- Unix的IO模型
- epoll对于文件描述符操作模式
- 用户空间和内核空间
- NIO与普通IO的主要区别
- Paths,Path,Files
- Buffer
- Channel
- Selector
- Pipe
- Charset
- NIO代码
- 多线程
- 创建线程
- 线程常用方法
- 线程池相关
- 线程池概念
- ThreadPoolExecutor
- Runnable和Callable
- 常用的几种线程池
- 线程安全
- 线程同步的几种方法
- synchronized
- 死锁
- lock接口
- ThreadLoad
- ReentrantLock
- 读写锁
- 锁的相关概念
- volatile
- 释放锁和不释放锁的操作
- 等待唤醒机制
- 线程状态
- 守护线程和普通线程
- Lamda表达式
- 反射相关
- 类加载器
- 反射
- 注解
- junit注解
- 动态代理
- 网络编程相关
- 简介
- UDP
- TCP
- 多线程socket上传图片
- NIO
- JDBC相关
- JDBC
- 预处理
- 批处理
- 事务
- properties配置文件
- DBUtils
- DBCP连接池
- C3P0连接池
- 获得MySQL自动生成的主键
- Optional类
- Jigsaw模块化
- 日志相关
- JDK日志
- log4j
- logback
- xml
- tomcat
- maven
- 简介
- 仓库
- 目录结构
- 常用命令
- 生命周期
- idea配置
- jar包冲突
- 依赖范围
- 私服
- 插件
- git-commit-id-plugin
- maven-assembly-plugin
- maven-resources-plugin
- maven-compiler-plugin
- versions-maven-plugin
- maven-source-plugin
- tomcat-maven-plugin
- 多环境
- 自定义插件
- stream
- swing
- json
- jackson
- optional
- junit
- gradle
- servlet
- 配置
- ServletContext
- 生命周期
- HttpServlet
- request
- response
- 乱码
- session和cookie
- cookie
- session
- jsp
- 简介
- 注释
- 方法,成员变量
- 指令
- 动作标签
- 隐式对象
- EL
- JSTL
- javaBean
- listener监听器
- Filter过滤器
- 图片验证码
- HttpUrlConnection
- 国际化
- 文件上传
- 文件下载
- spring
- 简介
- Bean
- 获取和实例化
- 属性注入
- 自动装配
- 继承和依赖
- 作用域
- 使用外部属性文件
- spel
- 前后置处理器
- 生命周期
- 扫描规则
- 整合多个配置文件
- 注解
- 简介
- 注解分层
- 类注入
- 分层和作用域
- 初始化方法和销毁方法
- 属性
- 泛型注入
- Configuration配置文件
- aop
- aop的实现
- 动态代理实现
- cglib代理实现
- aop名词
- 简介
- aop-xml
- aop-注解
- 代理方式选择
- jdbc
- 简介
- JDBCTemplate
- 事务
- 整合
- junit整合
- hibernate
- 简介
- hibernate.properties
- 实体对象三种状态
- 检索方式
- 简介
- 导航对象图检索
- OID检索
- HQL
- Criteria(QBC)
- Query
- 缓存
- 事务管理
- 关系映射
- 注解
- 优化
- MyBatis
- 简介
- 入门程序
- Mapper动态代理开发
- 原始Dao开发
- Mapper接口开发
- SqlMapConfig.xml
- map映射文件
- 输出返回map
- 输入参数
- pojo包装类
- 多个输入参数
- resultMap
- 动态sql
- 关联
- 一对一
- 一对多
- 多对多
- 整合spring
- CURD
- 占位符和sql拼接以及参数处理
- 缓存
- 延迟加载
- 注解开发
- springMVC
- 简介
- RequestMapping
- 参数绑定
- 常用注解
- 响应
- 文件上传
- 异常处理
- 拦截器
- springBoot
- 配置
- 热更新
- java配置
- springboot配置
- yaml语法
- 运行
- Actuator 监控
- 多环境配置切换
- 日志
- 日志简介
- logback和access
- 日志文件配置属性
- 开机自启
- aop
- 整合
- 整合Redis
- 整合Spring Data JPA
- 基本查询
- 复杂查询
- 多数据源的支持
- Repository分析
- JpaSpecificationExecutor
- 整合Junit
- 整合mybatis
- 常用注解
- 基本操作
- 通用mapper
- 动态sql
- 关联映射
- 使用xml
- spring容器
- 整合druid
- 整合邮件
- 整合fastjson
- 整合swagger
- 整合JDBC
- 整合spingboot-cache
- 请求
- restful
- 拦截器
- 常用注解
- 参数校验
- 自定义filter
- websocket
- 响应
- 异常错误处理
- 文件下载
- 常用注解
- 页面
- Thymeleaf组件
- 基本对象
- 内嵌对象
- 上传文件
- 单元测试
- 模拟请求测试
- 集成测试
- 源码解析
- 自动配置原理
- 启动流程分析
- 源码相关链接
- Servlet,Filter,Listener
- springcloud
- 配置
- 父pom
- 创建子工程
- Eureka
- Hystrix
- Ribbon
- Feign
- Zuul
- kotlin
- 基本数据类型
- 函数
- 区间
- 区块链
- 简介
- linux
- ulimit修改
- 防止syn攻击
- centos7部署bbr
- debain9开启bbr
- mysql
- 隔离性
- sql执行加载顺序
- 7种join
- explain
- 索引失效和优化
- 表连接优化
- orderby的filesort问题
- 慢查询
- show profile
- 全局查询日志
- 死锁解决
- sql
- 主从
- IDEA
- mac快捷键
- 美化界面
- 断点调试
- 重构
- springboot-devtools热部署
- IDEA进行JAR打包
- 导入jar包
- ProjectStructure
- toString添加json模板
- 配置maven
- Lombok插件
- rest client
- 文档显示
- sftp文件同步
- 书签
- 代码查看和搜索
- postfix
- live template
- git
- 文件头注释
- JRebel
- 离线模式
- xRebel
- github
- 连接mysql
- 选项没有Java class的解决方法
- 扩展
- 项目配置和web部署
- 前端开发
- json和Inject language
- idea内存和cpu变高
- 相关设置
- 设计模式
- 单例模式
- 简介
- 责任链
- JUC
- 原子类
- 原子类简介
- 基本类型原子类
- 数组类型原子类
- 引用类型原子类
- JVM
- JVM规范内存解析
- 对象的创建和结构
- 垃圾回收
- 内存分配策略
- 备注
- 虚拟机工具
- 内存模型
- 同步八种操作
- 内存区域大小参数设置
- happens-before
- web service
- tomcat
- HTTPS
- nginx
- 变量
- 运算符
- 模块
- Rewrite规则
- Netty
- netty为什么没用AIO
- 基本组件
- 源码解读
- 简单的socket例子
- 准备netty
- netty服务端启动
- 案例一:发送字符串
- 案例二:发送对象
- websocket
- ActiveMQ
- JMS
- 安装
- 生产者-消费者代码
- 整合springboot
- kafka
- 简介
- 安装
- 图形化界面
- 生产过程分析
- 保存消息分析
- 消费过程分析
- 命令行
- 生产者
- 消费者
- 拦截器interceptor
- partition
- kafka为什么快
- kafka streams
- kafka与flume整合
- RabbitMQ
- AMQP
- 整体架构
- RabbitMQ安装
- rpm方式安装
- 命令行和管控页面
- 消息生产与消费
- 整合springboot
- 依赖和配置
- 简单测试
- 多方测试
- 对象支持
- Topic Exchange模式
- Fanout Exchange订阅
- 消息确认
- java client
- RabbitAdmin和RabbitTemplate
- 两者简介
- RabbitmqAdmin
- RabbitTemplate
- SimpleMessageListenerContainer
- MessageListenerAdapter
- MessageConverter
- 详解
- Jackson2JsonMessageConverter
- ContentTypeDelegatingMessageConverter
- lucene
- 简介
- 入门程序
- luke查看索引
- 分析器
- 索引库维护
- elasticsearch
- 配置
- 插件
- head插件
- ik分词插件
- 常用术语
- Mapping映射
- 数据类型
- 属性方法
- Dynamic Mapping
- Index Template 索引模板
- 管理映射
- 建立映射
- 索引操作
- 单模式下CURD
- mget多个文档
- 批量操作
- 版本控制
- 基本查询
- Filter过滤
- 组合查询
- 分析器
- redis
- String
- list
- hash
- set
- sortedset
- 发布订阅
- 事务
- 连接池
- 管道
- 分布式可重入锁
- 配置文件翻译
- 持久化
- RDB
- AOF
- 总结
- Lettuce
- zookeeper
- zookeeper简介
- 集群部署
- Observer模式
- 核心工作机制
- zk命令行操作
- zk客户端API
- 感知服务动态上下线
- 分布式共享锁
- 原理
- zab协议
- 两阶段提交协议
- 三阶段提交协议
- Paxos协议
- ZAB协议
- hadoop
- 简介
- hadoop安装
- 集群安装
- 单机安装
- linux编译hadoop
- 添加新节点
- 退役旧节点
- 集群间数据拷贝
- 归档
- 快照管理
- 回收站
- 检查hdfs健康状态
- 安全模式
- hdfs简介
- hdfs命令行操作
- 常见问题汇总
- hdfs客户端操作
- mapreduce工作机制
- 案例-单词统计
- 局部聚合Combiner
- combiner流程
- combiner案例
- 自定义排序
- 自定义Bean对象
- 排序的分类
- 案例-按总量排序需求
- 一次性完成统计和排序
- 分区
- 分区简介
- 案例-结果分区
- 多表合并
- reducer端合并
- map端合并(分布式缓存)
- 分组
- groupingComparator
- 案例-求topN
- 全局计数器
- 合并小文件
- 小文件的弊端
- CombineTextInputFormat机制
- 自定义InputFormat
- 自定义outputFormat
- 多job串联
- 倒排索引
- 共同好友
- 串联
- 数据压缩
- InputFormat接口实现类
- yarn简介
- 推测执行算法
- 本地提交到yarn
- 框架运算全流程
- 数据倾斜问题
- mapreduce的优化方案
- HA机制
- 优化
- Hive
- 安装
- shell参数
- 数据类型
- 集合类型
- 数据库
- DDL操作
- 创建表
- 修改表
- 分区表
- 分桶表
- DML操作
- load
- insert
- select
- export,import
- Truncate
- 注意
- 严格模式
- 函数
- 内置运算符
- 内置函数
- 自定义函数
- Transfrom实现
- having和where不同
- 压缩
- 存储
- 存储和压缩结合使用
- explain详解
- 调优
- Fetch抓取
- 本地模式
- 表的优化
- GroupBy
- count(Distinct)去重统计
- 行列过滤
- 动态分区调整
- 数据倾斜
- 并行执行
- JVM重用
- 推测执行
- reduce内存和个数
- sql查询结果作为变量(shell)
- youtube
- flume
- 简介
- 安装
- 常用组件
- 拦截器
- 案例
- 监听端口到控制台
- 采集目录到HDFS
- 采集文件到HDFS
- 多个agent串联
- 日志采集和汇总
- 单flume多channel,sink
- 自定义拦截器
- 高可用配置
- 使用注意
- 监控Ganglia
- sqoop
- 安装
- 常用命令
- 数据导入
- 准备数据
- 导入数据到HDFS
- 导入关系表到HIVE
- 导入表数据子集
- 增量导入
- 数据导出
- 打包脚本
- 作业
- 原理
- azkaban
- 简介
- 安装
- 案例
- 简介
- command类型单一job
- command类型多job工作流flow
- HDFS操作任务
- mapreduce任务
- hive脚本任务
- oozie
- 安装
- hbase
- 简介
- 系统架构
- 物理存储
- 寻址机制
- 读写过程
- 安装
- 命令行
- 基本CURD
- java api
- CURD
- CAS
- 过滤器查询
- 建表高级属性
- 与mapreduce结合
- 与sqoop结合
- 协处理器
- 参数配置优化
- 数据备份和恢复
- 节点管理
- 案例-点击流
- 简介
- HUE
- 安装
- storm
- 简介
- 安装
- 集群启动及任务过程分析
- 单词统计
- 单词统计(接入kafka)
- 并行度和分组
- 启动流程分析
- ACK容错机制
- ACK简介
- BaseRichBolt简单使用
- BaseBasicBolt简单使用
- Ack工作机制
- 本地目录树
- zookeeper目录树
- 通信机制
- 案例
- 日志告警
- 工具
- YAPI
- chrome无法手动拖动安装插件
- 时间和空间复杂度
- jenkins
- 定位cpu 100%
- 常用脚本工具
- OOM问题定位
- scala
- 编译
- 基本语法
- 函数
- 数组常用方法
- 集合
- 并行集合
- 类
- 模式匹配
- 异常
- tuple元祖
- actor并发编程
- 柯里化
- 隐式转换
- 泛型
- 迭代器
- 流stream
- 视图view
- 控制抽象
- 注解
- spark
- 企业架构
- 安装
- api开发
- mycat
- Groovy
- 基础