Linux內(nèi)核源代碼分析經(jīng)驗(yàn)
531
2025-04-09
今日內(nèi)容:
1. Servlet 2. HTTP協(xié)議 3. Request
1
2
3
Servlet:
1. 概念 2. 步驟 3. 執(zhí)行原理 4. 生命周期 5. Servlet3.0 注解配置 6. Servlet的體系結(jié)構(gòu) Servlet -- 接口 | GenericServlet -- 抽象類 | HttpServlet -- 抽象類 * GenericServlet:將Servlet接口中其他的方法做了默認(rèn)空實(shí)現(xiàn),只將service()方法作為抽象 * 將來(lái)定義Servlet類時(shí),可以繼承GenericServlet,實(shí)現(xiàn)service()方法即可 * HttpServlet:對(duì)http協(xié)議的一種封裝,簡(jiǎn)化操作 1. 定義類繼承HttpServlet 2. 復(fù)寫doGet/doPost方法 7. Servlet相關(guān)配置 1. urlpartten:Servlet訪問(wèn)路徑 1. 一個(gè)Servlet可以定義多個(gè)訪問(wèn)路徑 : @WebServlet({"/d4","/dd4","/ddd4"}) 2. 路徑定義規(guī)則: 1. /xxx:路徑匹配 2. /xxx/xxx:多層路徑,目錄結(jié)構(gòu) 3. *.do:擴(kuò)展名匹配
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
HTTP:
* 概念:Hyper Text Transfer Protocol 超文本傳輸協(xié)議 * 傳輸協(xié)議:定義了,客戶端和服務(wù)器端通信時(shí),發(fā)送數(shù)據(jù)的格式 * 特點(diǎn): 1. 基于TCP/IP的高級(jí)協(xié)議 2. 默認(rèn)端口號(hào):80 3. 基于請(qǐng)求/響應(yīng)模型的:一次請(qǐng)求對(duì)應(yīng)一次響應(yīng) 4. 無(wú)狀態(tài)的:每次請(qǐng)求之間相互獨(dú)立,不能交互數(shù)據(jù) * 歷史版本: * 1.0:每一次請(qǐng)求響應(yīng)都會(huì)建立新的連接 * 1.1:復(fù)用連接 * 請(qǐng)求消息數(shù)據(jù)格式 1. 請(qǐng)求行 請(qǐng)求方式 請(qǐng)求url 請(qǐng)求協(xié)議/版本 GET /login.html HTTP/1.1 * 請(qǐng)求方式: * HTTP協(xié)議有7中請(qǐng)求方式,常用的有2種 * GET: 1. 請(qǐng)求參數(shù)在請(qǐng)求行中,在url后。 2. 請(qǐng)求的url長(zhǎng)度有限制的 3. 不太安全 * POST: 1. 請(qǐng)求參數(shù)在請(qǐng)求體中 2. 請(qǐng)求的url長(zhǎng)度沒有限制的 3. 相對(duì)安全 2. 請(qǐng)求頭:客戶端瀏覽器告訴服務(wù)器一些信息 請(qǐng)求頭名稱: 請(qǐng)求頭值 * 常見的請(qǐng)求頭: 1. User-Agent:瀏覽器告訴服務(wù)器,我訪問(wèn)你使用的瀏覽器版本信息 * 可以在服務(wù)器端獲取該頭的信息,解決瀏覽器的兼容性問(wèn)題 2. Referer:http://localhost/login.html * 告訴服務(wù)器,我(當(dāng)前請(qǐng)求)從哪里來(lái)? * 作用: 1. 防盜鏈: 2. 統(tǒng)計(jì)工作: 3. 請(qǐng)求空行 空行,就是用于分割POST請(qǐng)求的請(qǐng)求頭,和請(qǐng)求體的。 4. 請(qǐng)求體(正文): * 封裝POST請(qǐng)求消息的請(qǐng)求參數(shù)的 * 字符串格式: POST /login.html HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://localhost/login.html Connection: keep-alive Upgrade-Insecure-Requests: 1 username=zhangsan * 響應(yīng)消息數(shù)據(jù)格式
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
Request:
1. request對(duì)象和response對(duì)象的原理 1. request和response對(duì)象是由服務(wù)器創(chuàng)建的。我們來(lái)使用它們 2. request對(duì)象是來(lái)獲取請(qǐng)求消息,response對(duì)象是來(lái)設(shè)置響應(yīng)消息 2. request對(duì)象繼承體系結(jié)構(gòu): ServletRequest -- 接口 | 繼承 HttpServletRequest -- 接口 | 實(shí)現(xiàn) org.apache.catalina.connector.RequestFacade 類(tomcat) 3. request功能: 1. 獲取請(qǐng)求消息數(shù)據(jù) 1. 獲取請(qǐng)求行數(shù)據(jù) * GET /day14/demo1?name=zhangsan HTTP/1.1 * 方法: 1. 獲取請(qǐng)求方式 :GET * String getMethod() 2. (*)獲取虛擬目錄:/day14 * String getContextPath() 3. 獲取Servlet路徑: /demo1 * String getServletPath() 4. 獲取get方式請(qǐng)求參數(shù):name=zhangsan * String getQueryString() 5. (*)獲取請(qǐng)求URI:/day14/demo1 * String getRequestURI(): /day14/demo1 * StringBuffer getRequestURL() :http://localhost/day14/demo1 * URL:統(tǒng)一資源定位符 : http://localhost/day14/demo1 中華人民共和國(guó) * URI:統(tǒng)一資源標(biāo)識(shí)符 : /day14/demo1 共和國(guó) 6. 獲取協(xié)議及版本:HTTP/1.1 * String getProtocol() 7. 獲取客戶機(jī)的IP地址: * String getRemoteAddr() 2. 獲取請(qǐng)求頭數(shù)據(jù) * 方法: * (*)String getHeader(String name):通過(guò)請(qǐng)求頭的名稱獲取請(qǐng)求頭的值 * Enumeration
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
案例:用戶登錄
* 用戶登錄案例需求: 1.編寫login.html登錄頁(yè)面 username & password 兩個(gè)輸入框 2.使用Druid數(shù)據(jù)庫(kù)連接池技術(shù),操作mysql,day14數(shù)據(jù)庫(kù)中user表 3.使用JdbcTemplate技術(shù)封裝JDBC 4.登錄成功跳轉(zhuǎn)到SuccessServlet展示:登錄成功!用戶名,歡迎您 5.登錄失敗跳轉(zhuǎn)到FailServlet展示:登錄失敗,用戶名或密碼錯(cuò)誤 * 分析 * 開發(fā)步驟 1. 創(chuàng)建項(xiàng)目,導(dǎo)入html頁(yè)面,配置文件,jar包 2. 創(chuàng)建數(shù)據(jù)庫(kù)環(huán)境 CREATE DATABASE day14; USE day14; CREATE TABLE USER( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(32) UNIQUE NOT NULL, PASSWORD VARCHAR(32) NOT NULL ); 3. 創(chuàng)建包c(diǎn)n.itcast.domain,創(chuàng)建類User package cn.itcast.domain; /** * 用戶的實(shí)體類 */ public class User { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } } 4. 創(chuàng)建包c(diǎn)n.itcast.util,編寫工具類JDBCUtils package cn.itcast.util; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import javax.xml.crypto.Data; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; /** * JDBC工具類 使用Durid連接池 */ public class JDBCUtils { private static DataSource ds ; static { try { //1.加載配置文件 Properties pro = new Properties(); //使用ClassLoader加載配置文件,獲取字節(jié)輸入流 InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); //2.初始化連接池對(duì)象 ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /** * 獲取連接池對(duì)象 */ public static DataSource getDataSource(){ return ds; } /** * 獲取連接Connection對(duì)象 */ public static Connection getConnection() throws SQLException { return ds.getConnection(); } } 5. 創(chuàng)建包c(diǎn)n.itcast.dao,創(chuàng)建類UserDao,提供login方法 package cn.itcast.dao; import cn.itcast.domain.User; import cn.itcast.util.JDBCUtils; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; /** * 操作數(shù)據(jù)庫(kù)中User表的類 */ public class UserDao { //聲明JDBCTemplate對(duì)象共用 private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); /** * 登錄方法 * @param loginUser 只有用戶名和密碼 * @return user包含用戶全部數(shù)據(jù),沒有查詢到,返回null */ public User login(User loginUser){ try { //1.編寫sql String sql = "select * from user where username = ? and password = ?"; //2.調(diào)用query方法 User user = template.queryForObject(sql, new BeanPropertyRowMapper
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
Servlet TCP/IP
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。