Servlet&HTTP&Request筆記

      網(wǎng)友投稿 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 getHeaderNames():獲取所有的請(qǐng)求頭名稱 3. 獲取請(qǐng)求體數(shù)據(jù): * 請(qǐng)求體:只有POST請(qǐng)求方式,才有請(qǐng)求體,在請(qǐng)求體中封裝了POST請(qǐng)求的請(qǐng)求參數(shù) * 步驟: 1. 獲取流對(duì)象 * BufferedReader getReader():獲取字符輸入流,只能操作字符數(shù)據(jù) * ServletInputStream getInputStream():獲取字節(jié)輸入流,可以操作所有類型數(shù)據(jù) * 在文件上傳知識(shí)點(diǎn)后講解 2. 再?gòu)牧鲗?duì)象中拿數(shù)據(jù) 2. 其他功能: 1. 獲取請(qǐng)求參數(shù)通用方式:不論get還是post請(qǐng)求方式都可以使用下列方法來(lái)獲取請(qǐng)求參數(shù) 1. String getParameter(String name):根據(jù)參數(shù)名稱獲取參數(shù)值 username=zs&password=123 2. String[] getParameterValues(String name):根據(jù)參數(shù)名稱獲取參數(shù)值的數(shù)組 hobby=xx&hobby=game 3. Enumeration getParameterNames():獲取所有請(qǐng)求的參數(shù)名稱 4. Map getParameterMap():獲取所有參數(shù)的map集合 * 中文亂碼問(wèn)題: * get方式:tomcat 8 已經(jīng)將get方式亂碼問(wèn)題解決了 * post方式:會(huì)亂碼 * 解決:在獲取參數(shù)前,設(shè)置request的編碼request.setCharacterEncoding("utf-8"); 2. 請(qǐng)求轉(zhuǎn)發(fā):一種在服務(wù)器內(nèi)部的資源跳轉(zhuǎn)方式 1. 步驟: 1. 通過(guò)request對(duì)象獲取請(qǐng)求轉(zhuǎn)發(fā)器對(duì)象:RequestDispatcher getRequestDispatcher(String path) 2. 使用RequestDispatcher對(duì)象來(lái)進(jìn)行轉(zhuǎn)發(fā):forward(ServletRequest request, ServletResponse response) 2. 特點(diǎn): 1. 瀏覽器地址欄路徑不發(fā)生變化 2. 只能轉(zhuǎn)發(fā)到當(dāng)前服務(wù)器內(nèi)部資源中。 3. 轉(zhuǎn)發(fā)是一次請(qǐng)求 3. 共享數(shù)據(jù): * 域?qū)ο螅阂粋€(gè)有作用范圍的對(duì)象,可以在范圍內(nèi)共享數(shù)據(jù) * request域:代表一次請(qǐng)求的范圍,一般用于請(qǐng)求轉(zhuǎn)發(fā)的多個(gè)資源中共享數(shù)據(jù) * 方法: 1. void setAttribute(String name,Object obj):存儲(chǔ)數(shù)據(jù) 2. Object getAttitude(String name):通過(guò)鍵獲取值 3. void removeAttribute(String name):通過(guò)鍵移除鍵值對(duì) 4. 獲取ServletContext: * ServletContext getServletContext()

      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

      Servlet&HTTP&Request筆記

      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(User.class), loginUser.getUsername(), loginUser.getPassword()); return user; } catch (DataAccessException e) { e.printStackTrace();//記錄日志 return null; } } } 6. 編寫cn.itcast.web.servlet.LoginServlet類 package cn.itcast.web.servlet; import cn.itcast.dao.UserDao; import cn.itcast.domain.User; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.設(shè)置編碼 req.setCharacterEncoding("utf-8"); //2.獲取請(qǐng)求參數(shù) String username = req.getParameter("username"); String password = req.getParameter("password"); //3.封裝user對(duì)象 User loginUser = new User(); loginUser.setUsername(username); loginUser.setPassword(password); //4.調(diào)用UserDao的login方法 UserDao dao = new UserDao(); User user = dao.login(loginUser); //5.判斷user if(user == null){ //登錄失敗 req.getRequestDispatcher("/failServlet").forward(req,resp); }else{ //登錄成功 //存儲(chǔ)數(shù)據(jù) req.setAttribute("user",user); //轉(zhuǎn)發(fā) req.getRequestDispatcher("/successServlet").forward(req,resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); } } 7. 編寫FailServlet和SuccessServlet類 @WebServlet("/successServlet") public class SuccessServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取request域中共享的user對(duì)象 User user = (User) request.getAttribute("user"); if(user != null){ //給頁(yè)面寫一句話 //設(shè)置編碼 response.setContentType("text/html;charset=utf-8"); //輸出 response.getWriter().write("登錄成功!"+user.getUsername()+",歡迎您"); } } @WebServlet("/failServlet") public class FailServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //給頁(yè)面寫一句話 //設(shè)置編碼 response.setContentType("text/html;charset=utf-8"); //輸出 response.getWriter().write("登錄失敗,用戶名或密碼錯(cuò)誤"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } } 8. login.html中form表單的action路徑的寫法 * 虛擬目錄+Servlet的資源路徑 9. BeanUtils工具類,簡(jiǎn)化數(shù)據(jù)封裝 * 用于封裝JavaBean的 1. JavaBean:標(biāo)準(zhǔn)的Java類 1. 要求: 1. 類必須被public修飾 2. 必須提供空參的構(gòu)造器 3. 成員變量必須使用private修飾 4. 提供公共setter和getter方法 2. 功能:封裝數(shù)據(jù) 2. 概念: 成員變量: 屬性:setter和getter方法截取后的產(chǎn)物 例如:getUsername() --> Username--> username 3. 方法: 1. setProperty() 2. getProperty() 3. populate(Object obj , Map map):將map集合的鍵值對(duì)信息,封裝到對(duì)應(yīng)的JavaBean對(duì)象中

      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)容。

      上一篇:Spark_算子調(diào)優(yōu)
      下一篇:怎么更改屏保時(shí)間(怎么改變屏保時(shí)間)
      相關(guān)文章
      国产亚洲精品线观看动态图| 欧美亚洲精品一区二区| 国产亚洲漂亮白嫩美女在线| 国产精品亚洲精品观看不卡| 亚洲性猛交xx乱| 亚洲国产美女视频| 亚洲成A∨人片在线观看无码| 亚洲网站免费观看| 久久久久久久亚洲Av无码| 亚洲AV成人精品网站在线播放| 亚洲国产一成人久久精品| 成人午夜亚洲精品无码网站| 亚洲中文字幕第一页在线| 亚洲色欲久久久综合网东京热 | 久久亚洲AV永久无码精品| 亚洲无码精品浪潮| 青青草原亚洲视频| 亚洲国产日韩在线视频| 亚洲AV无码乱码在线观看富二代| 久久精品国产亚洲AV麻豆不卡| 亚洲av女电影网| 亚洲系列国产精品制服丝袜第| 亚洲图片激情小说| 亚洲va久久久久| 国产精品无码亚洲精品2021| 亚洲成A人片在线观看中文| 精品国产香蕉伊思人在线在线亚洲一区二区 | 久久精品国产精品亚洲蜜月| 亚洲免费视频在线观看| 精品亚洲成a人片在线观看少妇| 亚洲精品成人图区| 国产午夜亚洲精品| 亚洲AV无码一区二区三区性色 | 激情无码亚洲一区二区三区 | 亚洲欧美aⅴ在线资源| 亚洲精品第一综合99久久| 久久综合久久综合亚洲| 久久亚洲精品无码av| 亚洲欧洲中文日韩久久AV乱码| 在线a亚洲v天堂网2019无码| 久久精品国产亚洲AV麻豆~|