[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>
~~~
運行結果如下:

`<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>
~~~
運行結果如下:

若將以上 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>
~~~
第一次運行結果仍不變,但第二次運行時結果如下圖

原因是:第一次運行時,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分析
- JpaSpeci?cationExecutor
- 整合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
- 基礎