HTML&XML
1.JavaWeb的概述
A: 什麼是Web----->就是網頁或者網站
B: 什麼是JavaWeb----->就是使用java語言做web
C: 浏覽器通路網站的原理 && 靜态資源和動态資源的差別
2. Html的概述
Html: Hyper Text Markup Language 超文本标記語言
超文本: 超出純文字的範疇
标記語言: 标記其實就是标簽 标簽的格式: <标簽名稱>
3. Html文檔的組成以及标簽規範
A: Html文檔的組成
(1): <html></html>來明确html文檔的範圍
(2): <head></head>标簽可以設定一個内容比如: <title></title>
(3): <body></body>标簽設定要在頁面顯示的内容
B: Html标簽的規範
(1): Html标簽通常是成對出現的,比如 <b> 和 </b>
(2): 标簽對中的第一個标簽是開始标簽,第二個标簽是結束标簽
(3): 絕大多數的标簽都具有屬性,建議屬性值使用引号引起。例如:<body text=”red”>
(4): 大多數标簽是可以嵌套的
(5): Html标簽是不區分大小寫的
(6): Html檔案的字尾名是html或者htm
4. Html标簽之文字标簽和注釋标簽
注釋标簽: <!-- 注釋的文字 -->
文字标簽:
(1): 标簽格式: <font>具體的文字</font>
(2): 标簽的屬性
(a)size: 指定文字的大小,取值範圍值是1~7.如果取值超出7按照7進行設定 ;如果取值小于1,按照1進行設定
(b)face: 規定文本的字型
(c)color: 指定文字的顔色
顔色的取值有3中形式
第一種: 直接使用英文字母表示,比如: red , blue , yellow , green ....
第二種: 使用RGB (值1, 值2 , 值3)表示.每一個值得取值範圍是 0~255
第三種: 使用#值1值2值3表示.每一個值得取值是一個兩位的16進制資料
5. Html标簽之标題标簽和水準線标簽
A: 标題标簽
(1): 标簽格式: <h1>對應的文字</h1> , <h2>對應的文字</h2> , ..... <h6>對應的文字</h6>
(2): 标簽的特點: 從h1到h6依次變小,并且帶有換行
B: 水準線标簽
(1): 标簽的格式: <hr/>
(2): 标簽的屬性:
(a): color:設定顔色
(b): size:設定粗細
(c): width:設定長度
(d): align:設定具體的位置取值:right , left , center
6. Html标簽之清單标簽
A: 定義清單标簽(dl标簽)
标簽名: <dl><dt></dt> <dd></dd> </dl>
B: 有序清單标簽(ol标簽)
标簽名<ol type=“1”><li></li><ol>
type取值: 1(預設) , a , i
C: 無序清單标簽(ul标簽)
标簽名: <ul type=“circle”><li></li></ul>
type取值: 空心圓circle , 實心圓disc(預設) , 實心方塊square
7. Html标簽之圖像标簽
A: 标簽格式: <img src="圖檔的路徑"/>
B: 标簽的屬性:
(a): src: 指定圖檔的路徑
(b): width: 設定圖檔的寬度
(c): height: 設定圖檔的高度
C: 絕對路徑: 從盤符開始的路徑或者從一個域名開始的路徑
D: 相對路徑: 相對于某一個檔案的路徑
(a): 引用的檔案和目前檔案在同一個路徑,直接寫檔案名稱
(b): 引用的檔案在目前檔案的上級目錄中,需要使用../../這種形式指定
(c): 引用的檔案在目前檔案的下級目錄中,從對應的檔案夾開始即可
技巧: 把對象的檔案的路徑做比較,比較不同的部分
8. Html标簽之超連結标簽
A: 連結資源
(1): 标簽格式: <a href=“連結到資源的路徑”>顯示在頁面上的内容</a>
(2): 屬性
(a): href: 連結到的資源路徑
(b): target: “_blank”(新頁面打開) , “_self”(目前頁打開,預設)
當不需要連結具體的頁面的時候href需要設定預設的占位符”#”
B: 定位資源
(1): 定位位置;比如:<a name=“top”>頂部位置</a>
(2): 回到這個位置; 比如: <a href=“#top”>回到頂部位置</a>
C: 原樣輸出标簽: <pre>要顯示的内容</pre>
9. Html标簽之表格标簽
A: 作用: 可以對資料進行格式化,使資料顯示更加清晰
B: 标簽名稱:
表格标簽:<table></table>
行标簽: <tr></tr>
單元格标簽: <td><td>
單元格居中以及加粗标簽: <th></th>
表格标題标簽: <caption></caption>
C:表格标簽屬性:
border: 設定邊框
cellspacing: 設定單元格的間距
width: 寬
height: 高
D: 行标簽屬性:
align: 設定對齊方式: center , right , left
E: 單元格标簽屬性:
align: 設定對齊方式: center , right , left
colspan: 跨列
rowspan: 跨行
10. Html标簽之表單标簽
A: 作用: 送出資料到伺服器端
B: 表單的屬性
form定義表單的範圍<form action="#" method="get"> …….</form>
action : 指定送出的伺服器的位址
method: 指定表單送出資料的方式
文本框: <input type="text" name="userName">
密碼框: <input type="password" name="password">
單選項: <input type="radio" name="sex" value="1" >, 需要添加name屬性和value屬性 ,預設選中要設定為: checked="checked"
複選框: <input type="checkbox"> , 需要添加name屬性和value屬性 ,預設選中為: checked="checked"
檔案框: <input type="file" >
文本域: <textarea cols="列" rows="行" name="userInfo"></textarea>
送出按鈕: <input type="submit" value="顯示的文字"/>
圖檔送出: <input type="image" src="圖檔的路徑" />
重置按鈕: <input type="reset" value="顯示的文字"/>
普通按鈕: <input type="button" value="顯示的文字"/> (通常和js配合使用)
隐藏項: <input type="hidden" name="id" value="123">
下拉輸入項:
<select name="stu">
<option>--請選擇--</option>
<option value="1">高中</option>
<option value="2">大學</option>
</select><br/>
表單的送出方式:
get: 送出的時候把請求參數直接拼接到url後面 , 不安全 , 對請求參數的資料大小有限制,不能超過1k
post: 送出的時候請求參數沒有在url後面 , 安全 ;
案例:
<!DOCTYPE html>
<html>
<head>
<title>表單.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<form action="#" method="get" >
<table border="1" width="300" cellspacing="0" align = "center">
<tr>
<td align="right"><b>使用者名:</b></td>
<td align="left"><input type="text" size="30"></td>
</tr>
<tr>
<td align="right"><b>密 碼:</b></td>
<td align="left"><input type="password" size="31"></td>
</tr>
<tr>
<td align="right"><b>性 别:</b></td>
<td align="left">
<input type="radio" name="sex" value="female" checked="checked" >男
<input type="radio" name="sex" value="male">女
</td>
</tr>
<tr>
<td align="right"><b>愛 好:</b></td>
<td align="left">
<input type="checkbox" name="habbit" value="Java">Java
<input type="checkbox" name="habbit" value="Android">Android
<input type="checkbox" name="habbit" value="IOS">IOS
<input type="checkbox" name="habbit" value="PHP">PHP
</td>
</tr>
<tr>
<td align="right"><b>學 曆:</b></td>
<td
align="left"><select name="edu">
<option value="" >請選擇</option>
<option value="zk" >專科</option>
<option value="bk" >大學</option>
<option value="ss" >碩士</option>
</select>
</td>
</tr>
<tr>
<td align="right"><b>近 照:</b></td>
<td align="left"><input type="file" name="file"></td>
</tr>
<tr>
<td align="right"><b>備 注:</b></td>
<td
align="left"><textarea rows="10" cols="20" name="desc" >這家夥很懶!神馬也沒留下!</textarea>
</td>
</tr>
<tr>
<td align="center" colspan = "2">
<input type="submit" value="送出"/>
<input type="reset" value="重置"/>
</td>
</tr>
</table>
</form>
</body>
</html>
11. Html标簽之其他标簽和特殊字元
A: 其他常用标簽
b (加粗), s(删除線) , u(下劃線) , i(斜體) , pre(原樣輸出) , sub(下标) ,sup(上标) , p(段落标簽) , div(自動換行) , span(在一行上顯示)
B: 特殊字元标簽
空格
< 小于号
> 大于号
® 注冊符
© 版權
12. Html标簽之架構标簽
A: 注意: 架構标簽的頁面不能寫在<body></body>中
B: <frameset>: 架構的格式
屬性:
rows=“30%,*”
cols=“3%,*”
C: <frame>: 指定引入的頁面
name=“名稱”
src=“頁面的路徑”
13. XML的概述和作用
A: 概述: Extensible Markup Language: 可擴充的标記語言
B: 特點:
文法很嚴格
标簽自定義
C: 作用:
* 存儲資料
* 做配置檔案
* 用于進行資料傳輸
D: 文檔聲明: 标示這個文檔是一個xml文檔
<?xml version="1.0" ?>
屬性:
* version: 版本号, 必須屬性 , 隻能為1.x
* encoding: 編碼 , 作用是告訴解析器該文檔使用的編碼
* standalone: 是否獨立
E: 标簽
F: 屬性
B: 文本: 轉義 , <![CDATA[...]]>
14. XML的解析
A: 擷取文檔中的資料: 反序列化[巧記:反讀]
B: 把記憶體中的資料存儲到文檔中: 序列化[巧記:序寫]
C: XML解析思想
* DOM: 就是将文檔中的資料全部加載到記憶體,在記憶體中形成DOM樹,然後對資料進行增删改查操作
* 缺點: 耗記憶體 , 解析慢
* 優點: 可以對資料進行增删改查的操作
* SAX: 基于事件驅動 , 逐行讀取
* 優點: 占用記憶體小,解析速度快
* 缺點: 隻能對資料進行查,不能進行增删改
15.常見的解析器以及pull解析器的擷取事件
A: 解析器的作用: 解析xml檔案
B: 建立的解析器: JAXP(sun公司的,支援DOM和sax的思想 ,但是很垃圾) , JDOM ,DOM4J ,
PULL: sax思想的解析器,android内置的解析器
C: 使用PULL解析器解析xml檔案
16.pull解析器解析xml檔案封裝對象到集合中
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import com.loaderman.domain.Person;
public class PullPerson {
public static void main(String[] args) throws IOException,
XmlPullParserException {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(
new FileInputStream(
"D:\\MyEclipse_Workspace\\myday01\\src\\com\\loaderman\\test\\Person.xml"),
"UTF-8");
int type = parser.getEventType();
List<Person> list = null;
Person p = null;
while (type != XmlPullParser.END_DOCUMENT) {
String tagName = parser.getName();
switch (type) {
case XmlPullParser.START_TAG:
if ("persons".equals(tagName)) {
list = new ArrayList<>();
} else if ("person".equals(tagName)) {
p = new Person();
} else if ("name".equals(tagName)) {
String name = parser.nextText();
p.setName(name);
} else if ("age".equals(tagName)) {
String age = parser.nextText();
p.setAge(Integer.parseInt(age));
} else if ("address".equals(tagName)) {
String address = parser.nextText();
p.setAddress(address);
} else if ("phone".equals(tagName)) {
String phone = parser.nextText();
p.setPhone(phone);
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(tagName)) {
list.add(p);
}
break;
}
type = parser.next();
}
System.out.println(list);
}
}
注: 需要借助kxml2-2.3.0.jar和xmlpull_1_1_3_4c.jar檔案
Person.xml
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<name>張三</name>
<age>23</age>
<address>北京</address>
<phone>13121031022</phone>
</person>
<person>
<name>李四</name>
<age>24</age>
<address>西安</address>
<phone>13121031024</phone>
</person>
<person>
<name>王五</name>
<age>24</age>
<address>上海</address>
<phone>13121031026</phone>
</person>
</persons>
Person執行個體類中代碼
public class Person {
private String name;
private int age;
private String address;
private String phone;
public Person() {
super();
}
public Person(String name, int age, String address, String phone) {
super();
this.name = name;
this.age = age;
this.address = address;
this.phone = phone;
}
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + ", address=" + address
+ ", phone=" + phone + "]";
}
}
mysql
1.xml寫資料: 序列化
import java.io.FileOutputStream;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import com.loaderman.domain.Student;
public class DemoPull {
public static void main(String[] args) throws Exception {
Student stu = new Student();
stu.setName("JCF");
stu.setAge(20);
stu.setScore(100);
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlSerializer serializer = factory.newSerializer();
serializer.setOutput(new FileOutputStream("students.xml"), "utf-8");
serializer.startDocument("utf-8",true);
serializer.startTag(null, "students");
serializer.startTag(null, "student");
serializer.startTag(null, "name");
serializer.text(stu.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(String.valueOf(stu.getAge()));
serializer.endTag(null, "age");
serializer.startTag(null, "score");
serializer.text(String.valueOf(stu.getScore()));
serializer.endTag(null, "score");
serializer.endTag(null, "student");
serializer.endTag(null,"students" );
serializer.endDocument();
}
}
2.json
A: json的概述: JavaScript Object Notation , JavaScript對象表示法
B: 作用: 資料表示格式
C: 特點: JSON 比 XML 更小、更快,更易解析。
D: 格式: {} , []
E: 使用jsonlib解析json資料
注:需要借助commons-beanutils-1.8.3.jar, commons-collections-3.2.1.jar,
commons-lang-2.6.jar, commons-logging-1.1.1.jar, ezmorph-1.0.6.jar和json-lib-2.4-jdk15.jar檔案
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class DemoJson {
/**
* @param args 解析json格式的資料
*/
public static void main(String[] args) {
String s = "{'name' : 'zhansgan' , 'age' : 23 , 'score': 99.88}";
JSONObject jo = JSONObject.fromObject(s);
Object bean= jo.toBean(jo, Student.class);
System.out.println(bean);
System.out.println("---------------------------------------------------------------");
String ss = "[{'name' : 'zhansgan' , 'age' : 23 , 'score': 99.88} ,{'name' : 'lisi' , 'age' : 24 , 'score': 100}
,{'name' : 'wangwu' , 'age' : 25 , 'score': 23.45} ]";
JSONArray fo = JSONArray.fromObject(ss);
Student[] array = (Student[]) fo.toArray(fo,Student.class);
for (Student student : array) {
System.out.println(student);
}
}
}
3.資料庫的概述
A: 資料庫的概述: 用來存儲和管理資料的倉庫
B: 常見的資料庫:
Oracle:甲骨文; 大型的關系型資料庫 , 收費的
DB2:IBM; 大型的關系型資料庫 , 收費的
SQL Server:微軟; 中型的關系型資料庫 , 收費的
MySQL:甲骨文; 小型的關系型資料庫 , 免費的 , 但是6.x以後就開始收費了
4. MySql資料庫的下載下傳,安裝以及解除安裝
A: 下載下傳
B: 解除安裝
1.找到mysql安裝目錄下的my.ini檔案
2.找到配置項datadir datadir="D:/develop /MySQL/MySQL Server 5.0/Data/"
3.關閉mysql服務
4.解除安裝
5.删除datadir
C: 安裝
D: 通路:cmd指令: mysql -uroot –p 回車 ,再輸入密碼
5. MySql資料庫的相關配置
A: 服務的啟動與關閉
* 啟動 net start mysql
* 關閉 net stop mysql
* 打開服務視窗 services.msc
*查詢端口号: netstat -ano
B: mysql密碼忘記以後,如何修改密碼
1) 停止mysql服務 運作輸入services.msc 停止mysql服務或者 cmd -- net stop mysql
2) 在cmd下 輸入 mysqld --skip-grant-tables 啟動服務 光标不動 (不要關閉該視窗)
3) 新打開cmd 輸入mysql -u root -p 不需要密碼 use mysql; update user set password=password('abc') WHERE User='root';
4) 關閉兩個cmd視窗 在任務管理器結束mysqld 程序
5) 在服務管理頁面 重新開機mysql服務
6. MySql資料庫的SQL
A: SQL:Structured Query Language是“結構化查詢語言”,它是對關系型資料庫的操作語言。就是定義了一些操作關系型資料庫的統一規範.而每一種資料庫之間
又存在一些不同之處,這些不同之處稱之為"方言"
B: SQL的分類
DDL(Data Definition Language):資料定義語言,用來操作庫,表
DML(Data Manipulation Language):資料操作語言,用來操作表中存儲的資料,但是隻能完成增 , 删 , 改
DCL(Data Control Language):資料控制語言,操作使用者自己的,完成權限的相關控制
DQL(Data Query Language):資料查詢語言,用來操作表中存儲的資料,但是隻能完成查
7. MySql資料庫的SQL(DDL)操作庫
A: 操作庫
* 增 create database [if not exists] my db ;
* 删 drop database [if exists] mtdb ;
* 查 show databases ;
* 改 alter database mydb character set utf-8 ;
B: 檢視前面建立的資料庫的定義資訊:show create database mydb1;
C: 查詢正在使用的資料庫:select database();
8. MySql資料庫的SQL(DDL)操作表之建立與查詢
A: 使用資料庫: use 資料庫名稱 ;
B: 建立表:
create table 表名 (
字段名稱 資料類型 ,
字段名稱 資料類型 ,
...
字段名稱 資料類型
) ;
* 資料庫中的資料類型
int:整型
double:浮點型,例如double(5,2)表示最多5位,其中必須有2位小數,即最大值為999.99;
char:固定長度字元串類型;
varchar:可變長度字元串類型;
text:字元串類型;
blob:位元組類型;
date:日期類型,格式為:yyyy-MM-dd;
time:時間類型,格式為:hh:mm:ss
timestamp:時間戳類型 格式為: yyyy-MM-dd hh:mm:ss
* 特點: 如果沒有給該字段指派,那麼存儲的就是目前的時間
C: 查詢:
show tables; 顯示目前庫下的所有的表
desc 表名; 顯示表的結構
9. MySql資料庫的SQL(DDL)操作表之删除與修改
A: 删除: drop table 表名稱 ;
B: 修改:
1. 添加列:給stu表添加classname列:
alter table stu add (classname varchar(100));
2. 修改列類型:修改stu表的gender列類型為CHAR(2):
alter table stu modify gender CHAR(2);
3. 修改列名:修改stu表的gender列名為sex:
alter table stu change gender sex CHAR(2);
4. 删除列:删除stu表的classname列:
alter table stu drop classname;
5. 修改表名稱:修改stu表名稱為student:
alter table stu rename to student;
10. MySql資料庫的SQL(DML)操作表之添加和完整限制
A: 增加: insert into 表名 (字段列明集合) values(值得集合) ;
* 要保證資料的正确性和完整性
完整性限制:
* 主鍵 一條資料在資料庫中的唯一辨別, 特點: 非空唯一 primary key
* 主鍵自增長 如果主鍵的是int,那麼如果給主鍵指派為null , 會自動根據上一條記錄的值+1 ; primary key aoto_increment
* 唯一 unique
* 非空 not null
* 外鍵
11. MySql資料庫的SQL(DML)操作表之外鍵限制
A: 外鍵限制: 一張表的主鍵作為另一張表的外鍵,就保證資料的完整性
* 注意事項: 主鍵必須和外鍵的資料類型一緻,名稱可以不一緻
B: 表和表之間的關系
* 一對一的關系 主外鍵可以在任意一方
* 一對多或者多對一的關系 外鍵添加到多的一方
* 多對多的關系 定義中間表,中間表的兩個字段都是外鍵,分别用于關聯兩個表的主鍵
C: 外鍵限制SQL示範
12. MySql資料庫的SQL(DML)操作表之删除和修改
A: 删除: delete from 表名 [where 條件] ;
* delete from 表名 ; -- 删除所有的資料 逐行删除
* truncate table 表名 ; -- 删除所有的資料(直接把表删除然後在在建立表)
B: 修改: update 表名 set 字段名 = 字段值 , 字段名 = 字段值 , ... [where 條件] ;
13.DML案例
-- 建立資料庫
create databases mydb ;
-- 查詢所有資料庫名稱
show databases ;
-- 删除資料庫
drop database stu;
-- 選擇使用的資料庫
use day02;
-- 建立表
create table student(
-- 字段名 資料類型
sid INT ,
sname VARCHAR(20),
gender CHAR(1),
score DOUBLE(4,2),
birthday TIMESTAMP
);
-- 檢視表名稱
show tables ;
-- 删除表
drop table stu;
-- 檢視表結構
desc student;
-- 修改表結構
-- 修改之添加列:給stu表添加classname列:
Alter table student add classname vercar(100);
-- 修改之修改列類型:修改stu表的gender列類型為char(2):
ALTER TABLE student MODIFY gender CHAR(2);
-- 修改之修改列名:修改stu表的gender列名為sex:
ALTER TABLE student CHANGE sex gender CHAR(1);
- 修改之删除列:删除stu表的classname列:
ALTER TABLE student DROP classname;
-- 修改表名稱
ALTER TABLE student RENAME TO tb_student;
DESC tb_student;
-- 插入資料
INSERT INTO tb_student(sid,sname,gender,score,birthday) VALUES(1,'風清揚','男',99.99,'1998-11-11');
INSERT INTO tb_student(sid,sname,gender,score,birthday) VALUES(2,'嶽不群','女',88.99,NULL);
INSERT INTO tb_student(sid,sname) VALUES(3,'貂蟬');
INSERT INTO tb_student VALUES(4,'呂布','男',88.99,NULL);
-- 删除資料
DELETE FROM tb_student WHERE sname = '貂蟬';
-- 查詢資料
SELECT * FROM tb_student;
-- 清空表中所有記錄
TRUNCATE TABLE tb_student;
-- 先删除表
DROP TABLE tb_student;
-- 再建立一張空表
CREATE TABLE tb_student(
-- 修改資料
UPDATE
tb_student
SET
gender = '無',
score = 12.88
WHERE
sid = 2;
-- 建立emp表
CREATE TABLE emp(
empno INT, -- 員工編号
ename VARCHAR(50), -- 員工姓名
job VARCHAR(50), -- 員工工種
mgr INT, -- 上司編号
hiredate DATE, -- 入職日期
sal DECIMAL(7,2), -- 工資
comm DECIMAL(7,2), -- 獎金
deptno INT -- 部門編号
) ;
-- 添加資料
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
-- 查詢所有列資料
SELECT * FROM emp;
SELECT
empno,
ename,
job
FROM
emp;
-- 結果集
-- 查詢工資是800塊的員工資訊
SELECT * FROM emp WHERE sal = 800;
-- 查詢工資大于等于2500的員工資訊
SELECT * FROM emp WHERE sal >= 2500;
-- 查詢工資小于等于2500的員工資訊
SELECT * FROM emp WHERE sal <= 2500;
-- 查詢員工資在1500 到 2500 之間
SELECT * FROM emp WHERE sal >= 1500 AND sal <=2500;
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 2500;
-- 查詢員工工資是1000 或者2000的人
SELECT * FROM emp WHERE sal = 800 OR sal = 5000;
SELECT * FROM emp WHERE sal IN(800,5000);
-- 查詢員工工資不是800
SELECT * FROM emp WHERE sal != 800;
SELECT * FROM emp WHERE sal <> 800;
-- 查詢有獎金的員工資訊
SELECT * FROM emp WHERE comm IS NOT NULL;
-- 查詢沒有有獎金的員工資訊
SELECT * FROM emp WHERE comm IS NULL;
-- 查詢姓s的使用者
SELECT * FROM emp WHERE ename LIKE 's%';
-- 查詢姓名第三個字元是I的使用者
SELECT * FROM emp WHERE ename LIKE '__I%';
-- 查詢名字有五位的使用者
SELECT * FROM emp WHERE ename LIKE '_____';
-- 查詢名字包含A的使用者
SELECT * FROM emp WHERE ename LIKE '%A%';
-- 起别名
SELECT ename 姓名,sal AS 工資, comm AS 獎金 FROM emp;
SELECT e.ename,e.job
FROM emp e;
-- 計算
SELECT ename , sal , comm , (sal+IFNULL(comm,0)) 月薪 FROM emp;
-- 去除重複記錄
SELECT DISTINCT sal FROM emp;
14. DQL案例
-- select empno , ename , job from emp ;
-- select * from emp where ename = 'smith';
SELECT * FROM emp WHERE ename != 'smith';
SELECT * FROM emp WHERE ename <> 'smith';
SELECT * FROM emp WHERE sal >= 1100 ;
SELECT * FROM emp WHERE sal >= 1250 AND comm > 400 ;
SELECT * FROM emp WHERE sal >= 1250 OR comm > 400 ;
SELECT * FROM emp WHERE comm IS NULL ;
SELECT * FROM emp WHERE comm IS NOT NULL ;
-- 查詢emp表中empno是7369 或者 7499 或者 7521的員工資訊
SELECT * FROM emp WHERE empno = 7369 OR empno = 7499 OR empno = 7521 ;
SELECT * FROM emp WHERE empno IN (7369 , 7499 , 7521) ;
SELECT * FROM emp WHERE empno NOT IN (7369 , 7499 , 7521) ;
SELECT * FROM emp WHERE empno BETWEEN 7782 AND 7902 ;
SELECT * FROM emp WHERE ename LIKE '%M%';
-- _: 表示比對任意單個字元
-- %: 表示比對任意多個字元
-- 查詢ename由4個字母組成的員工的資料
SELECT * FROM emp WHERE ename LIKE '____' ;
-- 查詢ename由M開始的員工的資料
SELECT * FROM emp WHERE ename LIKE 'M%' ;
SELECT DISTINCT sal FROM emp ;
SELECT * FROM emp ;
-- null在參與運算的時候結果都是null
-- ifnull(字段名稱 , 值)
SELECT * , sal + comm FROM emp ;
SELECT * , sal + IFNULL(comm , 0) FROM emp ;
-- as 關鍵字用來起别名
SELECT * , sal + IFNULL(comm , 0) AS income FROM emp ;
JDBC
1.MySql資料庫的SQL(DQL)操作表之查詢資料(條件查詢)\
A: 查詢:
SELECT selection_list /*要查詢的列名稱*/
FROM table_list /*要查詢的表名稱*/
WHERE condition /*行條件*/
GROUP BY grouping_columns /*對結果分組*/
HAVING condition /*分組後的行條件*/
ORDER BY sorting_columns /*對結果排序*/
LIMIT offset_start, row_count /*結果限定*/
B: 基礎查詢
* 查詢所有的列: select * from 表名 ;
* 查詢指定的列: select 列名1 , 列名2 , ... from 表名 ;
C: 條件查詢
=、!=、<>、<、<=、>、>=;
BETWEEN…AND;
IN(set);
IS NULL; 空不能使用 = 或者 != 進行判斷. 需要使用is null 或者 is not null ;
AND;
OR;
NOT;
2. MySql資料庫的SQL(DQL)操作表之查詢資料(模糊查詢)
A: 模糊查詢: select 列名1 , 列名2 , ... from 表名 where 字段名 like '值' ;
通配符:
* _ 比對任意單個字元
* % 比對任意多個字元
B: 字段控制查
* 去除重複: SELECT DISTINCT sal FROM emp;
* 字段運算: null 參與的運算結果都是null ; 如果是null我們就認為是0: IFNULL(字段名稱 , 要取的值)
* 别名: 使用 AS 關鍵字
3. MySql資料庫的SQL(DQL)操作表之查詢資料(排序)
A: 排序: order by 字段名 ; 後面可以跟多個排序字段,多個排序字段用”,”隔開
SELECT * FROM stu ORDER BY; 預設是升序
B: 升序: order by 字段名 asc ;
SELECT * FROM stu ORDER BY SUM ASC;
C: 降序: order by 字段名 desc ;
4. MySql資料庫的SQL(DQL)操作表之查詢資料(聚合函數和分組)
A: 聚合函數: 用來做縱向運算的函數
COUNT():統計指定列不為NULL的記錄行數;
MAX():計算指定列的最大值,如果指定列是字元串類型,那麼使用字元串排序運算;
MIN():計算指定列的最小值,如果指定列是字元串類型,那麼使用字元串排序運算;
SUM():計算指定列的數值和,如果指定列類型不是數值類型,那麼計算結果為0;
AVG():計算指定列的平均值,如果指定列類型不是數值類型,那麼計算結果為0;
B: 分組查詢: group by 分組字段 ;
* 注意事項: 在分組以後 , 查詢的字段隻能是分組字段或者聚合函數
* Where在分組之前,having在分組之後
* 在分組之前對結果進行限定,使用where子句
* 在分組之後對結果進行限定,使用having子句
* 需求: 查詢每一個部門的工資總和
Select deptno,sum(sal) from emp group by deptno;
* 需求: 查詢每個部門的部門編号以及每個部門的人數
Select deptno,count(1) from emp group by deptno;
* 需求: 查詢每個部門的部門編号以及每個部門工資大于1500的人數
Select deptno, count(1) from emp where sal>1500 group by deptno;
* 需求: 查詢工資總和大于9000的部門編号以及工資和
Select deptno, count(1) from emp group by deptno having sum(sal)>9000;
C: 分頁: limit 開始的記錄角标 , 每一頁的條數 ;
Select * from emp limit 0 , 5 ;
公式: 開始的記錄角标 = (頁碼 - 1) * 每一頁的條數
5. JDBC概述
A: JDBC: Java DataBase Connective java連接配接資料庫
B: JDBC:sun公司定義的一套操作資料庫的規範(接口)。要求所有資料庫驅動要想被Java操作都必須實作這套接口
C: 資料庫驅動:各個資料庫生成廠商,實作了JDBC接口,提供的一套實作了。來操作各自具體的資料庫。
6. JDBC快速入門
A: 實作步驟:
1.導入驅動jar包
2.注冊驅動。
3.擷取資料庫連接配接對象 Connection
4.定義sql語句
5.擷取執行sql的對象 Statement
6.執行sql。擷取傳回值
7.處理結果。
8.釋放資源。
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 注冊驅動
Class.forName("com.mysql.jdbc.Driver") ;
// 擷取連接配接對象
Connection conn = DriverManager.getConnection("jdbc:mysql:///mydb", "root", "1234") ;
// 擷取執行sql的對象
Statement statement = conn.createStatement() ;
// 執行sql
String sql = "insert into stu (sid , name , sal) values (38 , '嘿嘿' , 56.89)" ;
int count = statement.executeUpdate(sql) ; // 代表的意思是影響的行數
// 處理結果
System.out.println(count);
// 釋放資源
statement.close() ;
conn.close() ;
}
}
注:需要借助mysql-connector-java-5.1.7-bin.jar
7. JDBC各個類詳解-DriverManager
A: 作用:
1: 注冊驅動
Class.forName("com.mysql.jdbc.Driver") ;
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
2: 擷取資料庫連接配接對象
DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "1234") ;
jdbc: mysql:// localhost:3306 /mydb
jdbc的主協定 子協定 ip位址以及端口号 要連接配接的資料庫的名稱
如果我們連接配接的是本地的資料庫,那麼localhost:3306可以省略
jdbc:mysql:///mydb
8. JDBC各個類詳解-Connection
* 擷取執行sql語句對象
** createStatement(): 擷取Statement對象
** prepareStatement(String sql): 擷取預處理對象
** prepareCall(String sql): 擷取CallableStatement, 這個對象用來執行存儲過程
9. JDBC各個類詳解-Statement
* boolean execute(String sql): 可以執行所有類型的sql,如果第一個結果為 ResultSet 對象,則傳回 true;如果其為更新計數或者不存在任何結果,則傳回false
* int executeUpdate(String sql): 執行DML , 傳回的int類型的值表達的意思是影響的行數
* ResultSet executeQuery(String sql): 執行DQL , 傳回的ResultSet是存儲的查詢結果的集合
10. JDBC各個類詳解-ResultSet
A: boolean next(): 判斷是否存在下一行資料,如果存在傳回為true,并且将光标向下移動一位
B: getXxx(...) 擷取指定的字段對應的值
* 方法參數可以是指定列對應的編号,這個編号從1開始
* 方法參數也可以是對應的列的名稱
11. JDBC異常的處理方式
A: try...catch(...) {...} finally {}
B: 關閉ResultSet,Statement , Connection
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class ExceptionDemo {
public static void main(String[] args) {
Connection conn = null ;
Statement st = null ;
try {
// 注冊驅動
Class.forName("com.mysql.jdbc.Driver") ;
// 擷取連接配接對象
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "1234") ;
// 擷取執行sql的對象
st = conn.createStatement() ;
// 執行sql , 擷取結果
String sql = "insert into user(uid , name , sal) values (1 , 'zhansgan' , 34.56)" ;
int count = st.executeUpdate(sql) ;
// 處理結果
System.out.println(count);
} catch (Exception e) {
e.printStackTrace() ;
} finally { // 釋放資源
if(st != null) {
try {
st.close() ;
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close() ;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
12. JDBC工具類
A: 抽取兩個方法,一個擷取Connection對象,一個是釋放資源
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JdbcUtil {
private JdbcUtil() {} // 私有化構造方法
// 定義成員變量
private static String jdbcUrl= null ;
private static String userName = null ;
private static String password = null ;
// 加載資料
static {
try {
Properties prop = new Properties() ;
prop.load(new FileReader("jdbc.properties")) ;
jdbcUrl = prop.getProperty("jdbcUrl") ;
userName = prop.getProperty("userName") ;
password = prop.getProperty("password") ;
Class.forName(prop.getProperty("driverClassName"))
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 擷取連接配接
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(jdbcUrl, userName, password) ;
}
/**
* 釋放資源
*/
public static void close(Connection conn , Statement st , ResultSet rs) throws SQLException {
if(conn != null) conn.close() ;
if(st != null) st.close() ;
if(rs != null) rs.close() ;
}
}
13. JDBC類-PrepareStatement
A: 使用步驟
1: 定義sql的時候參數值使用占位符 ? 替換
2: 擷取PrepareStatement對象傳入sql
3: 使用PrepareStatement的setXxx方法給占位符複制
參數:
* int類型: 就是占位符的編号 ,從1開始
* Xxx類型: 要賦的具體的值
4: 執行sql的時候不需要傳遞具體的sql
B: 優點
1: 防止sql注入
2: 提高效率
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.loaderman.jdbc.utils.JdbcUtil;
/**
* 預編譯的執行sql的對象
*/
public class PreparedStatementDemo {
public static void main(String[] args) throws Exception {
// 擷取連接配接對象
Connection conn = JdbcUtil.getConnection() ;
// 定義sql
String sql = "select * from user where uid = ?" ;
// 擷取PreparedStatement對象
PreparedStatement ps = conn.prepareStatement(sql) ;
// 給占位符設定值
// 第一個參數占位符所對應的角标(角标從1開始), 第二個參數表示具體的值 ;
ps.setInt(1, 1) ;
// 執行
ResultSet rs = ps.executeQuery() ;
while(rs.next()) {
int uid = rs.getInt(1) ;
String name = rs.getString(2) ;
String password = rs.getString(3) ;
System.out.println(uid + "---" + name + "---" + password);
}
//釋放資源
JdbcUtil.close(conn, ps, rs) ;
}
}
14. JDBC類-日期的轉換
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Date;
import com.loaderman.jdbc.domain.Emp;
import com.loaderman.jdbc.utils.JdbcUtil;
public class JdbcDateDemo {
public static void main(String[] args) throws Exception {
// 建立emp對象
Emp emp = new Emp() ;
emp.setEmpNo(9527) ;
emp.setEname("華安") ;
emp.setHireDate(new Date()) ;
// 擷取連接配接對象以及PreparedStatement
Connection conn = JdbcUtil.getConnection() ;
String sql = "insert into emp(empno , ename , hiredate) values (? , ? , ?)" ;
PreparedStatement ps = conn.prepareStatement(sql) ;
// 指派
ps.setInt(1, emp.getEmpNo()) ;
ps.setString(2, emp.getEname()) ;
Date date = emp.getHireDate() ;
long time = date.getTime() ;
java.sql.Date date2 = new java.sql.Date(time) ;
ps.setDate(3, date2) ;
// 執行sql
ps.executeUpdate() ;
// 釋放資源
JdbcUtil.close(conn, ps, null) ;
}
}
import java.util.Date;
public class Emp {
private int empNo ; // 員工編号
private String ename ; // 員工名稱
private String job; // 崗位資訊
private int mgr ; // 經理編号
private Date hireDate ; // 入職日期
private double sal ; // 薪資
private double comm ; // 獎金
private int deptNo ; // 部門編号
public int getEmpNo() {
return empNo;
}
public void setEmpNo(int empNo) {
this.empNo = empNo;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getMgr() {
return mgr;
}
public void setMgr(int mgr) {
this.mgr = mgr;
}
public Date getHireDate() {
return hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public double getComm() {
return comm;
}
public void setComm(double comm) {
this.comm = comm;
}
public int getDeptNo() {
return deptNo;
}
public void setDeptNo(int deptNo) {
this.deptNo = deptNo;
}
@Override
public String toString() {
return "Emp [empNo=" + empNo + ", ename=" + ename + ", job=" + job
+ ", mgr=" + mgr + ", hireDate=" + hireDate + ", sal=" + sal
+ ", comm=" + comm + ", deptNo=" + deptNo + "]";
}
}
15. MetaData
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
public class MetaDataDemo {
public static void main(String[] args) throws Exception {
Connection conn = JdbcUtil.getConnection() ; // 擷取連接配接對象
String sql = "select * from emp" ; // 定義sql模闆
PreparedStatement ps = conn.prepareStatement(sql) ; // 擷取PreparedStatement對象
ResultSetMetaData metaData = ps.getMetaData() ; // 擷取結果集中繼資料
int columnCount = metaData.getColumnCount() ; // 擷取列的總數
ResultSet rs = ps.executeQuery() ; // 執行sql
while(rs.next()) {
Map<String , Object> map = new HashMap<String , Object>() ; // 定義一個Map集合對象,用這個對象存儲使用者的資料 , 一條資料就是一個Map集合
Emp emp = new Emp() ; // 建立Emp對象 , 用這個對象來封裝資料
for(int x = 1 ; x <= columnCount ; x++) { // 周遊列
String columnName = metaData.getColumnName(x) ; // 擷取列名稱
Object obj = rs.getObject(x) ; // 擷取列對應的值
if("empno".equals(columnName)) { // 把列的名稱作為鍵 , 值作為值存儲到Map集合中
map.put("empNo", obj) ;
}else {
map.put(columnName, obj) ;
}
}
BeanUtils.populate(emp, map) ; // 使用BeanUtils封裝資料
System.out.println(emp); // 列印對象
System.out.println("----------------------------------------"); // 列印華麗的分割線
}
}
}
tomcat+Http協定
1.WEB開發的三層架構
Web層:接收用戶端發送過來的資料,然後需要将資料傳遞給service層
Service層:業務邏輯層:業務:比如檢驗使用者名的是否存在,如果不存在則需要把使用者的資料存儲在資料庫中,如果存在,給web傳回一個false.
Dao層:資料通路層/持久化層
2. 事務的概述以及事務的處理
A:事務概述: 是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。
B:事務的處理
* 開始事務
* 送出事務
* 復原事務
C:代碼示範轉賬案例,加入事務處理
D: 注意: 在進行事務管理的時候,要求必須使用的是同一個連接配接對象
import java.sql.Connection;
import java.sql.PreparedStatement;
import com.loaderman.jdbc.utils.JdbcUtil;
public class AccountDao {
// 更新資料庫
public void updateAccount(String name , double money) throws Exception {
Connection conn = JdbcUtil.getConnection() ;
String sql = "update cust set account = account + ? where name = ?" ;
PreparedStatement ps = conn.prepareStatement(sql) ;
ps.setDouble(1, money) ;
ps.setString(2, name) ;
ps.executeUpdate() ;
}
}
import java.sql.Connection;
import java.sql.SQLException;
import com.loaderman.jdbc.dao.AccountDao;
import com.loaderman.jdbc.utils.JdbcUtil;
public class AccountService {
// 建立AccountDao對象
private AccountDao ad = new AccountDao() ;
/**
* 完成轉賬操作
* @param from
* @param to
* @param money
* @throws Exception
*/
public void switchAccount(String from , String to , double money) {
Connection conn = null ;
try {
conn = JdbcUtil.getConnection() ;
conn.setAutoCommit(false) ;
ad.updateAccount(from, -money) ;
System.out.println(1/0);
ad.updateAccount(to, money) ;
conn.commit() ;
} catch (Exception e) {
e.printStackTrace() ;
try {
conn.rollback() ;
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
JdbcUtil.close(conn, null, null) ;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
import org.junit.Test;
import com.loaderman.jdbc.service.AccountService;
public class AccountServiceTest {
@Test
public void testSwitchAccount() throws Exception {
AccountService as = new AccountService() ;
as.switchAccount("zhangsan", "lisi", 500) ;
}
}
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JdbcUtil {
private JdbcUtil() {} // 私有化構造方法
// 定義成員變量
private static String jdbcUrl= null ;
private static String userName = null ;
private static String password = null ;
// private static MyThreadLocal<Connection> tl = new MyThreadLocal<Connection>() ;
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>() ;
// 加載資料
static {
try {
Properties prop = new Properties() ;
prop.load(new FileReader("jdbc.properties")) ;
jdbcUrl = prop.getProperty("jdbcUrl") ;
userName = prop.getProperty("userName") ;
password = prop.getProperty("password") ;
Class.forName(prop.getProperty("driverClassName")) ;
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 擷取連接配接
*/
public static Connection getConnection() throws SQLException {
Connection conn = tl.get() ;
if(conn == null) {
conn = DriverManager.getConnection(jdbcUrl, userName, password) ;
tl.set(conn) ;
}
return conn;
}
/*
* 釋放資源
*/
public static void close(Connection conn , Statement st , ResultSet rs) throws SQLException {
if(conn != null) conn.close() ;
if(st != null) st.close() ;
if(rs != null) rs.close() ;
}
}
import java.security.MessageDigest;
import org.apache.commons.codec.binary.Hex;
public class Md5 {
public static String md5(String s) throws Exception {
MessageDigest instance = MessageDigest.getInstance("MD5") ;
byte[] bytes = instance.digest(s.getBytes()) ;
char[] hex = Hex.encodeHex(bytes) ;
return new String(hex) ;
}
}
import java.util.HashMap;
import java.util.Map;
/**
* 作用: 在同一個線程中共享資料
*/
public class MyThreadLocal<T> {
private Map<Thread , T> hashMap = new HashMap<Thread , T>() ;
/**
* 存儲資料
* @param conn
*/
public void set(T t) {
hashMap.put(Thread.currentThread(), t) ;
}
public T get() {
return hashMap.get(Thread.currentThread()) ;
}
}
import java.security.MessageDigest;
import org.apache.commons.codec.binary.Hex;
public class Md5 {
public static String md5(String s) throws Exception {
MessageDigest instance = MessageDigest.getInstance("MD5") ;
byte[] bytes = instance.digest(s.getBytes()) ;
char[] hex = Hex.encodeHex(bytes) ;
return new String(hex) ;
}
}
3.WEB伺服器的概述
A: 簡述WEB伺服器
作用:
* 用來接收用戶端的請求
* 處理請求, 把動态資源轉換成了靜态資源(web容器)
* 給用戶端響應
B: 伺服器的分類:
* weblogic:oracle公司 大型的JavaEE伺服器 收費的
* websphere:IBM公司 大型的JavaEE伺服器 收費的
* JBOOS:紅帽公司 大型的JavaEE伺服器 收費的
* tomcat:apache基金組織 中小型的JavaEE伺服器 開源的免費的。java語言開發的
4. Tomcat的啟動和關閉
A: 啟動,遇到一閃而過的問題,可能尚未配置JAVA_HOME
B: 8080端口被占用導緻啟動失敗
C: 關閉Tomcat的三種方式
* 點選x (不推薦)
* 輕按兩下shutdown.bat
* ctrl + c
5. Tomcat釋出項目
A: WEB項目的目錄結構介紹
B: 示範動态項目的建立
把項目打包成war包:
進入這個項目中,使用指令: jar cvf aaa.war *
C: 釋出動态項目的三種方式:
1. 直接複制項目到webapps下
2. 把項目打包成war包
3. 配置映射關系: <Context path="/aaa" docBase="項目所在路徑" />或者在conf\Catalina\localhost\下建立xxx.xml然後在該檔案中編寫Context
6. Http的概述
A: Http: Hyper Text Transfer Protocol 超文本傳輸協定
B: 傳輸協定: 定義了傳輸資料的格式
C: Http協定的特點:
* 是一種進階協定
* 是一種基于TCP的 協定
* 基于請求和響應模式
* 是一種無狀态的協定
7. Http的請求協定請求行的介紹
A: 請求協定包含的内容
* 請求行 GET /day04-tomcat/index.jsp HTTP/1.1
HTTP/1.1: 表示的是我們使用的是http協定的1.1版本
http協定1.0和http協定1.1的差別:
http1.0每一次請求都是一個連接配接
http1.1一次請求完畢以後,這個連接配接還不會立馬消失,而是存活一段時間,這個時間大概是3秒
/day04-tomcat/index.jsp: 請求項目的虛拟目錄 表示uri(統一資源辨別符)
http://localhost/day04-tomcat/index.jsp url(統一資源定位符)
GET: 表示的是請求方式
GET請求資料請求行中,不安全, 并且資料不能超過1k
POST請求的資料存儲在請求體中,安全
* 請求頭
* 請求空行
* 請求體: 存儲POST請求的資料
Servlet
1.Http的請求協定請求頭介紹
A: Referer
B: User-Agent
2. Http的url編碼
A: URL編碼的原理
B: 使用jdk提供的類完成URL的編解碼
public class UrlDemo {
public static void main(String[] args) throws Exception {
/**
* URLEncoder: 進行URL編碼
*/
String encode = URLEncoder.encode("張三", "utf-8") ; // %E5%BC%A0%E4%B8%89
System.out.println(encode);
System.out.println("----------------------------------------------");
/**
* URLDecoder: 進行解碼
*/
String result = URLDecoder.decode(encode, "utf-8") ;
System.out.println(result);
}
}
3. Http的響應協定
A: 響應行介紹,響應狀态碼
1XX: 用戶端請求伺服器,但是請求未完成,伺服器什麼事也沒幹
2XX: 表示響應成功,代表性的狀态碼就是200
3XX: 請求重定向,代表性的狀态碼302
4XX: 用戶端發送失敗,代表性的狀态碼是404
5XX: 伺服器錯誤,代表性的狀态碼是500
B: 内容:
* 響應行
* 響應頭
* 響應空行
* 響應體
4. Http的響應協定
A: 響應頭介紹
* Content-Type:text/html;charset=utf-8
* 告訴用戶端,伺服器發送消息體資料的資料類型和編碼方式。用戶端會按照相對應的解析器和編碼方式解析響應消息體資料
* mime類型:一種資料類型
* refresh:定時跳轉
* 時間;url=值
* 5;url=https:www.baidu.com
在<head></head> 中設定,要重定向的語句:
<meta http-equiv="refresh" content="5;url=http://localhost:8080/myday04-tomcat/MyJsp.jsp">
5. Servlet的概述
A: Servlet的概述: server applet , 是一個運作在伺服器端的小應用程式
B: 就是一個接口,作用: servlet 通常通過 HTTP(超文本傳輸協定)接收和響應來自 Web 用戶端的請求。
6. Servlet的入門案例
A: 編寫入門案例
* 建立一個web項目
* 定義一個類,然後讓該類去實作Servlet接口, 重寫方法
* 配置servlet的通路路徑
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ServletDemo1 implements Servlet {
@Override
public void destroy(){
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("哦....ServletDemo1...被通路了................");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return "";
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init....ServletDemo1................");
}
}
在web.xml<web-app></web-app>中配置:
<servlet>
<servlet-name>servletDemo1</servlet-name>
<servlet-class>com.loaderman.servlet.ServletDemo1</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<url-pattern>/haha</url-pattern> 注:這是代表要通路的路徑,可以随意定義,這是浏覽器要輸入的路徑
</servlet-mapping>
7.Servlet的運作原理
見圖
8. Servlet中的生命周期
A: Servlet的方法:
* init 初始化工作
* service 提供服務的,每通路一次就執行一次
* destroy 銷毀前執行
* getServletConfig 擷取配置資訊
* getServletInfo 擷取servlet資訊
B: Servlet的生命周期
* 被建立
* 提供服務
* 被銷毀
C: 見圖
9. ServletConfig對象的使用
A: 作用:
* 擷取Servlet的配置資訊
* 擷取ServletContext對象
B: 接收ServletConfig對象
10.Servlet的三種實作方式
A: 實作Servlet接口
B: 繼承GenericServlet
C: 繼承HttpServlet,它是對Http協定進行了封裝
11. 使用MyEclipse自動配置servlet
A: 建立servlet
B: 修改servlet模闆: MyEclipse\Common\plugins 搜尋wizard ,
找com.genuitec.eclipse.wizards_9.0.0.me201108091322.jar
12. ServletContext對象的概述以及展示存儲資料的功能
A: ServletContext對象的概述
B: 特點: 該對象是單例的
C: 作用:
* 它是域對象,可以用來存儲資料
* 擷取檔案的MIME類型
* 擷取檔案運作時候的真實路徑
D: 展示存儲資料
13. ServletContext對象擷取MIME類型以及擷取真實路徑
A: MIME類型: MIME類型就是設定某種擴充名的檔案用指定的應用程式來打開的方式類型,當該擴充名檔案被通路的時候,浏覽器會自動使用指定應用程式來打開。
擷取擷取方式: public String getMimeType(String file)
B: 擷取真實路徑
* 問題: 隻能在web環境下使用
* JDBCUtils擷取路徑改進,使用ClassLoader進行擷取
ServletContext context = getServletConfig().getServletContext() ;
String path = context.getRealPath("/") ; //D:\tomcat\apache-tomcat-7.0.26\webapps\day05-servlet\
String path = context.getRealPath("/mv.jpg") ; // 把mv.jpg存儲到WebRoot下的擷取方式
String path = context.getRealPath("/WEB-INF/classes/mv.jpg") ; // 把mv.jpg存儲到了src下的擷取方式 String path = context.getRealPath("/WEB-INF/mv.jpg") ; // 把mv.jpg存儲到WEB-INF目錄下的擷取方式
System.out.println(path);
Httpservlet
1.HttpServletRequest&HttpServletResponse簡單概述
注意: HttpServletRequest&HttpServletResponse對象不是由我們來建立的,而是由tomcat伺服器建立,那麼我們就可以直接來使用這兩個對象
A: HttpServletRequest: 封裝了我們的請求消息,擷取到請求資料
B: HttpServletResponse: 封裝了我們的響應消息,設定響應資料
C: 使用HttpServletResponse設定響應頭以及響應狀态碼完成重定向操作
* 響應行 http/1.1 200 OK void setStatus(int sc): 設定響應狀态碼
* 響應頭 void setHeader(String name, String value): 設定響應頭資訊
* 響應體 ServletOutputStream getOutputStream(): 擷取位元組輸出流,可以響應位元組資料
PrintWriter getWriter(): 擷取字元輸出流 , 可以響應字元資料
2.HttpServletResponse設定響應體響應字元資料
PrintWriter getWriter(): 擷取字元輸出流 , 可以響應字元資料
例子: response.getWriter().write("<h1>HelloWorld!<h1>") ;
第一種形式:
esponse.setCharacterEncoding("UTF-8");//擷取這個流對象之前設定一個編碼方式
response.setHeader("content-type", "text/html;charset=UTF-8") ;// 響應頭content-type
response.getWriter().write("你好啊啊 啊");
第二種形式:
response.setContentType("text/html;charset=utf-8") ;
response.getWriter().write("你好") ;
3. HttpServletResponse設定響應體響應位元組資料
ServletContext context = getServletConfig().getServletContext();
String path = context.getRealPath("/WEB-INF/classes/mv.jpg");
FileInputStream fis = new FileInputStream(path);
ServletOutputStream stream = response.getOutputStream();
IOUtils.copy(fis, stream) ;//借助commons-io-2.0.jar和commons-fileupload-1.2.1.jar
4. HttpServletRequest擷取請求行以及擷取請求頭
A: 作用: 1. 擷取請求消息資料 2. 完成請求轉發 3. 是域對象
B: 擷取請求行 GET /uri HTTP/1.1
String getMethod() 擷取請求方式
String getQueryString() 擷取請求參數
String getContextPath() 擷取虛拟目錄
String getRemoteAddr() 擷取ip位址
C: 擷取請求頭
String getHeader(String name) (user-agent)
String header = request.getHeader("user-agent") ;
if(header.contains("MSIE")) {
System.out.println("IE浏覽器...............");
response.sendRedirect("http://www.baidu.com") ;
}else if(header.contains("Chrome")) {
System.out.println("谷歌浏覽器...............");
response.sendRedirect("http://www.jd.com") ;
}else if(header.contains("Firefox")) {
System.out.println("火狐浏覽器...............");
}else {
System.out.println("其它浏覽器...............");
}
5. HttpServletRequest擷取請求體
A: 擷取請求體資料
* BufferedReader getReader()
* ServletInputStream getInputStream()
Doget:
String qs = request.getQueryString();
String line = request.getQueryString() ; // userName=zhangsan&password=123
String[] split = line.split("&") ;
for(String data : split) {
String[] info = data.split("=") ;
System.out.println(request.getMethod() + "----" + info[0] + "---" + info[1]);
/*
* GET----username---zhangsan
GET----password---123
*/
}
Dopost:
BufferedReader reader = request.getReader() ;
String line = reader.readLine() ; // userName=zhangsan&password=123
String[] split = line.split("&") ;
for(String data : split) {
String[] info = data.split("=") ;
System.out.println(request.getMethod() + "----" + info[0] + "---" + info[1]);
// POST----userName---qq
// POST----password---9
}
6. HttpServletRequest擷取請求參數通用的方式
* GET 和 POST 請求通用的擷取資料的方式
String getParameter(String name): 根據名稱擷取對應的請求參數的值
Enumeration getParameterNames(): 擷取所有的請求參數的名稱
Map<String , String[]> getParameterMap(): 擷取所有的請求參數對應的Map集合, 鍵是請求參數的名稱 ,值是請求參數的值
String[] getParameterValues(String name): 根據名稱擷取對應的請求參數的值對應的數組
String userName = request.getParameter("userName");
System.out.println(request.getMethod()+"----"+userName);
System.out.println("------------------");
Enumeration names = request.getParameterNames();
while(names.hasMoreElements()){
String name = (String) names.nextElement();
String value = request.getParameter(name);
System.out.println(name+"---"+value);
}
Map<String,String[]> map = request.getParameterMap();
Set<Entry<String, String[]>> entrySet = map.entrySet();
for (Entry<String, String[]> entry : entrySet) {
String key = entry.getKey();
String[] value = entry.getValue();
System.out.println(key + "----" + Arrays.toString(value));
}
User user = new User() ;
try {
BeanUtils.populate(user, map) ; // User [userName=zhangsan, password=888, hobby=[1, 2, 3]]
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(user);
7. 擷取請求參數亂碼問題
A: 通用的解決方案
第一種方式:
String userName = request.getParameter("userName") ;
byte[] bytes = userName.getBytes("iso8859-1");
userName = new String(bytes , "UTF-8") ;
System.out.println(request.getMethod()+userName);
第二種方式:
request.setCharacterEncoding("UTF-8") ;
String userName = request.getParameter("userName") ;
System.out.println(userName);
B: POST請求的亂碼
8. 請求轉發和重定向
A: 請求轉發 request.getRequestDispatcher("/servlet09").forward(request, response) ;
請求重定向 response.sendRedirect(request.getContextPath() + "/servlet09") ;
B: 域對象
C: 轉發和重定向的差別
9.檔案上傳對表單的要求(掌握)
A: 表單中要存在file檔案項
B: 表單必須為POST請求
C: 表單的enctype="multipart/form-data"
10. 檔案上傳對Servlet的要求
A: request.getParamter(String name)方法不能再使用了
B: 需要使用request.getInputStream()擷取輸入流對象然後在進行讀取資料
C: 解析資料
ServletInputStream inputStream = request.getInputStream() ;
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len = inputStream.read(bytes)) != -1) {
System.out.print(new String(bytes , 0 , len));
}
11. 檔案上傳使用Fileupload元件代碼實作
A: 使用FileUpload元件進行代碼實作
B: 實作步驟
1. 擷取解析器工廠: DiskFileItemFactory
2. 擷取解析器對象: ServletFileUpload
3. 解析request: public java.util.List<FileItem> parseRequest(javax.servlet.http.HttpServletRequest request)
4. 周遊這個List集合擷取每一個表單項,然後在進行其他操作
// 擷取解析器工廠
DiskFileItemFactory factory = new DiskFileItemFactory() ;
// 擷取解析器
ServletFileUpload sfu = new ServletFileUpload(factory) ;
// 解析request
List<FileItem> list = sfu.parseRequest(request) ;
// 周遊這個List集合
for(FileItem fi : list) {
if(fi.isFormField()) { // 普通表單項
String fieldName = fi.getFieldName() ;
String value = fi.getString("utf-8") ;
System.out.println(fieldName + "----" + value);
}else {
// 擷取上傳檔案的名稱
String name = fi.getName() ;
name = name.substring(name.lastIndexOf("\\") + 1) ;
name = UUIDUtil.getId() + "_" + name ;
String path = getServletContext().getRealPath("/images/" + name) ;
fi.write(new File(path));
12. 檔案下載下傳(掌握)
A: 實作方式:
* 超連結實作
* 代碼實作
/**
* 設定一個響應頭,然後給定兩個流,一個是輸入流一個是輸出流
* 一個頭兩個流
*/
response.setHeader("content-disposition", "attachment;filename=mv.jpg" );
//+ new String("哈哈.jpg".getBytes("GBK") , "iso8859-1")) ;
response.setHeader("content-disposition", "attachment;filename=+ new String("哈哈.jpg".getBytes("GBK") , "iso8859-1")) ; //如果是漢字的處理方式
String path = getServletContext().getRealPath("/mv.jpg") ;
FileInputStream fis = new FileInputStream(path) ;
ServletOutputStream out = response.getOutputStream() ;
IOUtils.copy(fis, out) ;